データベース通信セキュリティ

本章はデータベースとのネットワーク通信に関連する問題を取り扱います。これには、IP アドレスのバインドや TLS を用いた暗号化ネットワーク通信を含みます。

データベースサーバーの IP アドレスバインド

サービスとデータベース間の機微なデータベース通信を隔離するために、データベースサーバーが隔離された管理ネットワーク経由のみでデータベースと通信できるように設定することを強く推奨します。データベースサーバーがクライアントからの通信用のネットワークソケットをバインドするインターフェースまたは IP アドレスを制限することにより、これを実現できます。

MySQL のバインドアドレスの制限

my.cnf の場合:

[mysqld]
...
bind-address <ip address or hostname of management network interface>

PostgreSQL のバインドアドレスの制限

postgresql.conf の場合:

listen_addresses = <ip address or hostname of management network interface>

データベース通信

データベース通信を管理ネットワークに制限することに加えて、クラウド管理者がそれらのデータベースのバックエンドに TLS を要求するように設定することを強く推奨します。データベースのクライアント接続に TLS を使用することにより、改ざんや盗聴から通信を保護できます。次のセクションで議論するように、TLS を使用することにより、データベースのユーザー認証に X.509 証明書 (一般的に PKI として参照されます) を使用するフレームワークも提供できます。以下は、2 つの有名なデータベースバックエンド MySQL と PostgreSQL に TLS を典型的に設定する方法について示します。

注釈

証明書と鍵ファイルをインストールするとき、ファイルのパーミッションが制限されていることを確認します。たとえば、chmod 0600 を実行すると、データベースサーバー上の他のプロセスやユーザーによる権限のないアクセスを防ぐために、所有者がデータベースデーモンのユーザーに制限されます。

MySQL SSL 設定

以下の行をシステム全体の MySQL 設定ファイルに追加する必要があります。

my.cnf の場合:

[[mysqld]]
...
ssl-ca = /path/to/ssl/cacert.pem
ssl-cert = /path/to/ssl/server-cert.pem
ssl-key = /path/to/ssl/server-key.pem

Optionally, if you wish to restrict the set of SSL ciphers used for the encrypted connection. See ciphers for a list of ciphers and the syntax for specifying the cipher string:

ssl-cipher = 'cipher:list'

PostgreSQL SSL 設定

以下の行をシステム全体の PostgreSQL 設定ファイル postgresql.conf に追加する必要があります。

ssl = true

Optionally, if you wish to restrict the set of SSL ciphers used for the encrypted connection. See ciphers for a list of ciphers and the syntax for specifying the cipher string:

ssl-ciphers = 'cipher:list'

サーバー証明書、鍵、認証局 (CA) のファイルを $PGDATA ディレクトリの以下のファイルに置く必要があります。

  • $PGDATA/server.crt - サーバー証明書

  • $PGDATA/server.key - server.crt に対応する秘密鍵

  • $PGDATA/root.crt - 信頼された認証局

  • $PGDATA/root.crl - 証明書失効リスト