설명
MySQL의 LOAD DATA LOCAL은 데이터베이스에 연결한 클라이언트 호스트의 파일을 읽어 서버로 전송합니다. 여기서 클라이언트는 사용자의 PC나 애플리케이션 서버일 수 있습니다. local_infile이 활성화되어 있고 클라이언트도 로컬 파일 로드를 허용하면, 실행되는 SQL과 클라이언트 프로세스의 파일 읽기 권한에 따라 민감한 파일이 전송될 수 있습니다.
로컬 파일 가져오기가 필요하지 않으면 서버와 클라이언트 양쪽에서 비활성화하세요. 필요한 경우에도 파일 접근 범위와 연결할 서버를 제한해야 합니다.
잠재적 영향
- 공격자가 실행되는 SQL을 제어할 수 있으면 클라이언트 프로세스가 읽을 수 있는 파일이 데이터베이스로 전송될 수 있습니다.
- 신뢰할 수 없는 서버에 연결한 클라이언트는 의도하지 않은 파일 전송 요청을 받을 수 있습니다.
해결 방법
- 로컬 파일 가져오기가 불필요하면
local_infile을 문자열off로 설정하고 클라이언트에서도 비활성화하세요. 기존 가져오기 작업에 미치는 영향을 먼저 확인하세요. - 기존 인스턴스는 Cloud SQL 콘솔이나 지원되는 관리 도구/API로 변경하세요.
google.cloud1.14.0의 SQL 인스턴스 모듈은 기존 객체를 업데이트하지 못합니다. 플래그 목록을 교체할 때는 필요한 다른 설정도 보존하세요. - 기능이 필요하면 실행 가능한 SQL과 클라이언트가 읽을 수 있는 파일을 제한하고, 서버 신원을 검증하는 TLS 연결을 사용하세요. 필요한 가져오기 작업이 계속 동작하는지 확인하세요.
예시
다음은 MYSQL_5_6을 사용한 과거 설정 예시입니다. 실제 배포 전에 버전 지원과 환경별 설정을 확인하고, 플래그 값은 "on" 또는 "off"처럼 문자열로 명시하세요.
첫 번째 설정
yaml
- name: sql_instance
google.cloud.gcp_sql_instance:
auth_kind: serviceaccount
database_version: MYSQL_5_6
name: "{{ resource_name }}-2"
project: test_project
region: us-central1
service_account_file: /tmp/auth.pem
settings:
database_flags:
- name: local_infile
value: on
tier: db-n1-standard-1
state: present
서버에서 로컬 파일 가져오기를 허용하는 설정입니다. 클라이언트 설정과 파일 읽기 권한도 함께 제한해야 합니다.
비교 설정
yaml
- name: sql_instance
google.cloud.gcp_sql_instance:
auth_kind: serviceaccount
database_version: MYSQL_5_6
name: '{{ resource_name }}-2'
project: test_project
region: us-central1
service_account_file: /tmp/auth.pem
settings:
database_flags:
- name: local_infile
value: off
tier: db-n1-standard-1
state: present
서버에서 로컬 파일 가져오기를 끄는 설정입니다. 클라이언트의 로컬 파일 로드도 비활성화하고 기존 인스턴스에 변경이 적용되었는지 확인하세요.