🔒

データベースのセキュリティについて調べてみた

2023/12/28に公開

様々な分野のセキュリティが気になり調べてみました。
今回はデータベースのセキュリティです。
基本的な内容になります。

対象読者

  • データベースで気をつけるセキュリティについて知りたいエンジニア
  • 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;
CREATE ROLE [ロール名] [ロールの属性];  #ロール作成
ALTER ROLE [ロール名] [ロールの属性];   #ロール名にロール属性追加
DROP ROLE [ロール名] [ロールの属性];    #ロール名からロール属性削除

1-2-2.権限

  • 権限はロール(≒ユーザ)がデータベースを操作するために付与します。権限は複数種類あり、必要な権限のみをロールに割り当てます。
  • 権限の種類や割当方法は以下サイトを参照ください。

PostgreSQL 14.5文書 5.7. 権限

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.脆弱性管理

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   # ダンプファイルからリストア

参考文献

OSS-DB 第2回 ユーザ管理とセキュリティ
PostgreSQL 14.5文書

Discussion