본문 바로가기
SingleStoreDB/Support Bulletin

SingleStore에서 secure_file_priv 설정 방법 및 NULL값의 보안 위험 - [Support Bulletin 12]

by 에이플랫폼 [Team SingleStore Korea] 2025. 7. 18.

안녕하세요! 에이플랫폼 Support Bulletin의 열 두번째 이야기입니다. 😊

데이터베이스의 보안 설정은 시스템의 안정성과 신뢰성을 좌우합니다.

특히 secure_file_priv 변수는 파일 입출력 관련 기능을 제어하여 잠재적인 보안 위협을 줄이는 중요한 역할을 합니다.

이번 글에서는 secure_file_priv가 어떤 기능을 수행하는지 알아보고, 이를 NULL로 설정했을 때 어떤 현상이 발생하는지 상세히 살펴보겠습니다.


 

secure_file_priv 란 ?

secure_file_priv는 파일 입출력 작업의 보안 범위를 제어하는 시스템 변수입니다.

이 변수는 데이터베이스 서버가 파일을 읽거나 쓸 수 있는 디렉터리를 제한함으로써, 데이터 유출이나 시스템 침해와 같은 보안 위협을 최소화하는 역할을 합니다.

예를 들어, 데이터베이스 쿼리를 통해 테이블 데이터를 외부 파일로 내보내거나(SELECT... INTO OUTFILE), 외부 파일을 테이블로 불러올 때(LOAD DATA INFILE) 사용할 때 secure_file_priv에 지정된 경로만 접근이 허용됩니다.

이 변수가 어떻게 설정되어 있는지 확인하려면 다음 쿼리를 사용할 수 있습니다.

SELECT @@secure_file_priv;
+--------------------------+
| @@secure_file_priv       |
+--------------------------+
| /var/lib/memsql/db_files |
+--------------------------+
 
  • 경로가 지정되어 있으면 해당 디렉터리에서만 파일 작업이 가능합니다.
  • 값이 NULL이면 접근 가능한 모든 디렉터리에서 파일 작업이 가능합니다.
  • 아래는 secure_file_priv 에 설정된 경로가 아닌 파일의 입출력 사용 시 발생하는 에러입니다.
# LOAD DATA INFILE 예시 코드
LOAD DATA INFILE '/tmp/data.csv' 
INTO TABLE t2
FIELDS TERMINATED BY ','
ENCLOSED BY '"';
>>>
SQL Error [1016] [HY000]: (conn=198) Reading from this file is disallowed because of 
the secure_file_priv setting. 
Import and export operations are only allowed on files in the directory 
specified by secure_file_priv or its subdirectories. 
Filename: '/tmp/data.csv'

# SELECT INTO OUTFILE 예시 코드
SELECT * FROM t2 limit 5 INTO OUTFILE '/tmp/file_name.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
>>>
SQL Error [1016] [HY000]: (conn=198) Writing to this file is disallowed because of 
the secure_file_priv setting. 
Import and export operations are only allowed on files in the directory 
specified by secure_file_priv or its subdirectories. 
Filename: '/tmp/file_name.csv'
 

secure_file_priv는 DBMS의 파일 입출력 보안 정책을 결정하는 핵심 변수로, 잘못 설정할 경우 심각한 보안 취약점이 발생할 수 있습니다.

 

잘못된 설정이 초래할 수 있는 보안 문제

공격자가 악용할 수 있는 시나리오

  • 임의 파일 읽기
    • secure_file_priv 값이 너무 넓게 설정되어 있으면, 공격자는 SQL 인젝션 등으로 DB 서버의 임의 경로에서 파일을 읽을 수 있습니다.
    • 예를 들어, 시스템의 중요한 설정 파일(/etc/passwd, /etc/hosts 등)을 읽어내어 추가 공격에 활용할 수 있습니다.
  • 임의 파일 쓰기
    • 공격자가 파일 쓰기 권한을 얻은 경우, DB 서버 내 임의 위치에 악성 스크립트나 셸 파일을 생성할 수 있습니다.
    • 이로 인해 시스템 권한 상승이나 원격 코드 실행 등 심각한 보안 사고로 이어질 수 있습니다.
  • 데이터 유출
    • DB 내 민감 데이터를 파일로 내보내고, 이를 외부에서 접근 가능한 경로에 저장함으로써 데이터 유출이 발생할 수 있습니다. 특히, 외부에서 접근 가능한 디렉터리로 설정되어 있다면 더욱 위험합니다.

안전한 secure_file_priv 설정 방법

보안 강화를 위한 권장 설정값

secure_file_priv 값을 운영 서버 내 신뢰된 특정 디렉터리(예:/var/lib/memsql/db_files)로 설정해야 합니다.

이 디렉터리는 DB 파일 입출력 전용으로 사용하고, OS 권한도 최소화해야 합니다.

 


secure_file_priv 변경 방법

흔히 변수를 바꾸듯이 set global secure_file_priv = /; 와 같이 바꾸려 한다면 아래와 같은 에러가 발생합니다.

SQL Error [1238] [HY000]: (conn=13) Variable 'secure_file_priv' is a read only and only 
settable at startup variable
 

따라서 SingleStore에서 secure_file_priv 변수를 바꾸는 방법은 아래와 같습니다.

  1. 노드 정지
    • 모든 노드를 정시 시킵니다.
sdb-admin stop-node -a -y

2. 변수 수정

sdb-admin update-config --key=secure_file_priv --value=/<path>/<to>/<dir> -a

 

NULL 설정 방법

sdb-admin update-config --key=secure_file_priv --value=' ' -a

 

 

⚠️ secure_file_priv를 NULL로 설정할 때 주의할 점
만약 secure_file_priv 값을 명시하지 않으면, SingleStore 프로세스(memsqld)를 실행 중인 유저가 실행(x 권한)을 갖는 모든 디렉터리에 대해 파일 입출력이 가능해집니다.
이는 설정이 완전히 열려있는 상태(NULL)가 되며, 의도치 않은 경로에서 파일을 읽거나 쓰는 등의 보안 취약점이 발생할 수 있습니다.

 

3. 설정 반영

    • 클러스터를 재시작해야 적용됩니다.

4. 적용 확인

SELECT @@secure_file_priv;
+--------------------------+
| @@secure_file_priv       |
+--------------------------+
| /var/lib/memsql/db_files |
+--------------------------+
 

secure_file_priv는 단순한 설정 항목이 아닌, 시스템 전반의 보안 체계를 좌우하는 핵심 요소입니다.

이 변수의 설정 방식에 따라 운영 환경은 외부 위협으로부터 안전해질 수도, 혹은 치명적인 취약점을 노출할 수도 있습니다.

운영 중인 데이터베이스의 파일 입출력 정책이 적절하게 적용되어 있는지 수시로 점검하고, 신뢰된 디렉터리를 지정하여 보안 리스크를 사전에 차단하는 것이 무엇보다 중요합니다.

더 많은 SingleStore 보안 팁과 실무 사례가 궁금하시다면, 에이플랫폼 네이버 카페의 정회원으로 가입해 보세요. 전문가들의 노하우와 다양한 기술 문서를 만나실 수 있습니다.

감사합니다 😊