🔒
データベースのセキュリティについて調べてみた
様々な分野のセキュリティが気になり調べてみました。
今回はデータベースのセキュリティです。
基本的な内容になります。
対象読者
- データベースで気をつけるセキュリティについて知りたいエンジニア
- PostgreSQLの基本的なセキュリティ設定を知りたいエンジニア
ゴール
- データベースで気をつけるセキュリティがわかる
- PostgreSQLの基本的なセキュリティ設定がわかる
データベースで気をつけるセキュリティ(5つ)
- サービスが保有するデータを守るためにデータベースのセキュリティが必要です。
- データにアクセスできる人を限定したりデータを暗号化して流出したとしても解読できないようにします。
以下5つが気をつけるポイントです。
1.アクセス制御
2.暗号化
3.脆弱性管理
4.ログの監視
5.バックアップと復旧
PostgreSQLのインストール
- 5つのポイントを説明する際に実際のRDBMSの設定も確認いたします。今回、OSSのRDBMS「PostgreSQL」を用いますので、必要に応じてインストールをお願いします。
- 「PostgreSQL」は、ver14.10となります。
1.アクセス制御
- 最小権限の原則。データベースへのアクセスを制限して、最低限のユーザ(役割も絞り込む)がアクセスできるようにします。
- パスワードのポリシー(●文字以上、大文字小文字記号ありなど)を強化し不正アクセスを防ぎます。
1-1.外部からの接続
1-1-1.接続元IPアドレス
データベースへアクセスできる接続元IPアドレスを指定します。
(設定ファイル)
ファイル名:pg_hba.conf
パス(Ubuntu):/etc/postgresql/14/main/pg_hba.conf
(設定項目)
接続方式、データベース名、ユーザ名、接続元ホスト、認証方式
設定例は以下の通り。
host all all 127.0.0.1/32 scram-sha-256
設定項目 | 設定値 |
---|---|
接続方式 | host : TCP/IP(暗号化ありなし両方) |
データベース名 | all |
ユーザ名 | all |
接続元ホスト | 127.0.0.1/32 |
認証方式 | scram-sha-256 |
1-1-2.データベースサーバ接続先IPアドレス
データベースサーバが持つIPアドレスの中で接続可能なIPアドレスを設定する。
(設定ファイル)
ファイル名:postgresql.conf
パス(Ubuntu):/etc/postgresql/14/main/postgresql.conf
(設定項目)
listen_addresses = '192.168.1.1'
1-2.データベースの権限
1-2-1.ロール
- ロールとはデータベース全体の権限を管理する仕組みです。
- ユーザはログインする機能を持つロールで、例えば以下のコマンドを打つとログインが可能なユーザ:user1が作成されたことになります。
CREATE ROLE user1 LOGIN;
- 以下のコマンドでロールの作成などが実施可能です。ロールの属性は以下サイトを参照ください。
PostgreSQL 14.5文書 22.2. ロールの属性
CREATE ROLE [ロール名] [ロールの属性]; #ロール作成
ALTER ROLE [ロール名] [ロールの属性]; #ロール名にロール属性追加
DROP ROLE [ロール名] [ロールの属性]; #ロール名からロール属性削除
1-2-2.権限
- 権限はロール(≒ユーザ)がデータベースを操作するために付与します。権限は複数種類あり、必要な権限のみをロールに割り当てます。
- 権限の種類や割当方法は以下サイトを参照ください。
2.暗号化
- データベースのデータを暗号化することで、データが盗まれたとしても情報を解読できないようにします。
- 暗号化は、データベース内のデータとデータ送受信時の2つについて気をつける必要があります。
2-1.通信暗号化
クライアントとデータベースサーバの間の通信をSSLで暗号化します。
(設定ファイル)
ファイル名:postgresql.conf
パス(Ubuntu):/etc/postgresql/14/main/postgresql.conf
(設定項目)
ssl = on
ssl_cert_file = '証明書のパス'
ssl_key_file = '秘密鍵のパス'
2-2.データ暗号化
データベースにデータをinsertする際に暗号化を行います。データを参照する際は復号が必要です。
# データを暗号化してinsert
INSERT INTO [テーブル名] VALUES (1, pgp_sym_encrypt([暗号化したいデータ], [暗号化用のパスワード]))
# select時にデータを復号
SELECT id, pgp_sym_decrypt([カラム名], [暗号化時に使用したパスワード]) FROM [テーブル名];
3.脆弱性管理
- PostgreSQL自体に脆弱性があれば、不正アクセスを受ける可能性があるので、脆弱性情報をチェックして必要に応じてアップデートしましょう。
- PostgreSQL脆弱性の例は以下の通り。
JVNDB-2023-001938 PostgreSQL における脆弱性
JVNDB-2022-016195 PostgreSQL.org の PostgreSQL における不完全なクリーンアップに関する脆弱性
4.ログの監視
データベースのログを監視し不正アクセスを検知できます。ログ出力の設定は以下の通り。
(設定ファイル)
ファイル名:postgresql.conf
パス(Ubuntu):/etc/postgresql/14/main/postgresql.conf
(設定項目)
log_destination = [出力形式] #ログの出力方法を指定。csvlog,syslogなど
logging_collector = [off or on] # stdrr, csvlogのログメッセージをファイルにリダイレクトする際はon
log_directory = [ログを保存したいpath] # logging_collector onの場合指定
log_filename = [ログのファイル名] # logging_collector onの場合指定
log_connections = [off or on] # データベースサーバ接続のログ
log_disconnections = [off or on] # データベースサーバ切断のログ
log_statement = 'all' # 全てのSQL文を記録
5.バックアップと復旧
- 定期的にバックアップ(ダンプファイル)を作成し、サイバー攻撃を受けたとしても復旧できる体制を整えましょう。
pg_dump [dbname] > dumpfile # ダンプファイル生成
psql [dbname] < dumpfile # ダンプファイルからリストア
Discussion