local_infile이 활성화된 Cloud SQL MySQL 인스턴스

LOAD DATA LOCAL은 클라이언트의 파일을 MySQL 서버로 전송합니다. 불필요한 파일 가져오기를 끄고 클라이언트의 파일 접근과 서버 신원 검증을 관리하세요.

설명

MySQL의 LOAD DATA LOCAL은 데이터베이스에 연결한 클라이언트 호스트의 파일을 읽어 서버로 전송합니다. 여기서 클라이언트는 사용자의 PC나 애플리케이션 서버일 수 있습니다. local_infile이 활성화되어 있고 클라이언트도 로컬 파일 로드를 허용하면, 실행되는 SQL과 클라이언트 프로세스의 파일 읽기 권한에 따라 민감한 파일이 전송될 수 있습니다.

로컬 파일 가져오기가 필요하지 않으면 서버와 클라이언트 양쪽에서 비활성화하세요. 필요한 경우에도 파일 접근 범위와 연결할 서버를 제한해야 합니다.

잠재적 영향

  • 공격자가 실행되는 SQL을 제어할 수 있으면 클라이언트 프로세스가 읽을 수 있는 파일이 데이터베이스로 전송될 수 있습니다.
  • 신뢰할 수 없는 서버에 연결한 클라이언트는 의도하지 않은 파일 전송 요청을 받을 수 있습니다.

해결 방법

  • 로컬 파일 가져오기가 불필요하면 local_infile을 문자열 off로 설정하고 클라이언트에서도 비활성화하세요. 기존 가져오기 작업에 미치는 영향을 먼저 확인하세요.
  • 기존 인스턴스는 Cloud SQL 콘솔이나 지원되는 관리 도구/API로 변경하세요. google.cloud 1.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

서버에서 로컬 파일 가져오기를 끄는 설정입니다. 클라이언트의 로컬 파일 로드도 비활성화하고 기존 인스턴스에 변경이 적용되었는지 확인하세요.

참조