説明
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
サーバーでローカルファイルの取り込みを無効にする設定です。クライアント側でも無効にし、既存インスタンスに変更が適用されたことを確認してください。