データベース セキュリティ対策の基本 研修コースに参加してみた
今回参加した研修コースは データベース セキュリティ対策の基本 です!
億単位の規模で個人情報が流出や、またビジネス側も BigQuery などを使ってデータベースを参照する時代になり、「データベースのセキュリティは大丈夫か?」と言われると、わかっていても不安になってしまうもの。
このコースで基本とその対策を確認できて、とても良かったです。
では、どんな内容だったのか、レポートします!!
もくじ
コース情報
想定している受講者 |
|
---|---|
受講目標 | データベースのセキュリティ対策の必要性と効果を説明できる |
講師紹介
今回登壇されたのは 代田 (しろた) 佳子さん です。
この参加してみたレポートでは初めてですね。
データベースではおなじみの林 優子さんとも同じ iThings研究所 の所属で、同じく Oracle Master 教科書の執筆、Oracle University から何度も表彰されている講師です。
受講してみると、林優子さん同様に、 RDBMS のアーキテクチャを熟知されていて、なぜ、そうなるのかわかりやすく解説頂けました。
システム全体への攻撃とデータベースへの攻撃
データベースのセキュリティというのが何を指すのか、システム全体への攻撃からブレイクダウンして説明します。
なお、今回は PostgreSQL を例として使います。
- システム全体への攻撃
- データベースへの攻撃
この攻撃をどうやって防ぐのか、それを今日は実際に試しながらやります。
データベースでのセキュリティ対策
先に挙げたデータベースへの攻撃への対策を挙げていただきました。
- 想定される被害
- アカウント乗っ取り
- データ・ファイル盗難
- 対策
- 認証
- 認可
- 暗号化
なお PostgresSQL では postmaster が認証を行い、OK であれば postgres というプロセスを起動し、その postgres にアプリケーションやユーザが接続し、操作を受けつけ結果を返す構成になっています。
認証
認証とのその対策を行う前に、どのようにデータベースは認証しているのか、プロセスを確認します。
ここから解説しながら、実際に操作します。
環境構築
- postgresql-10.5 を使用
- ユーザーを作成
createuser -U postgres -d -P -I -E [username]
- オプションで権限設定
- -d: DBを作成できる権限
- -P: パスワードを設定できる権限
- -I: ロール毎に決められた権限を引き継がない
- -E: DBユーザのパスワードを暗号化して格納
- database を作成
- 権限が違うことを確認
/* OSユーザー名と同じDBユーザーを作成 */ createuser -U postgres -d -P -I -E [OS username] /* データベースを作成 */ createdb userdb /* データベース一覧の確認 */ psql -l
- 権限が違うことを確認
認証
%PGHOME%\data\
に設定ファイルがある- pg_hba.conf に設定情報
- ユーザ情報を編集してみてる
type | database | user | address | method |
---|---|---|---|---|
host | userdb | all | ::1/128 | trust |
- パスワードなしでログインできることを確認 ->
psql userdb
代田さんからはユーザごとに適切に権限付与しましょう、との補足がありました。
アクセスログ
念のため、どこにログがあるか確認してみます。
%PGHOME%\data\log\postgresql-<今日の日付>.log
- 認証をわざと失敗して ↑ のログファイルを確認
2018-12-17 01:39:12.082 GMT [1976] FATAL: password authentication failed for user "postgres"
2018-12-17 01:39:12.082 GMT [1976] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 81: "host all all ::1/128 md5"
おや、2018 / 12 / 17 の日付が…
スイマセン、他業務に忙殺されていて、2ヶ月遅れで本レポートを書いております (汗)
認可 (権限付与)
できる権限をグループ化するのがロール (役割) です。
まずはユーザーに権限管理をしてみます。
create user user01 with password 'pass';
grant connect on database userdb to user01; --user01 で接続できることを確認
/* データベースに誰も接続できないようにしてみます */
revoke all on database userdb from PUBLIC;
ロールを作ってみる
いちいちユーザごとに細かい権限設定するのは大変です。
そこでロールでその権限を管理します。
/* group01 という役割を作ってユーザを紐づけ */
create role group01 login;
create role user02 login --ユーザ2を割当
connection limit 1
password 'pass' in role group01;
続いて、どんな操作に権限設定ができるのか確認しながら実行してみます
- connect / select / insert / update
また、この操作レベルだけでなく、テーブルの行レベルでも権限付与できるとのことでした。(スゴい)
他にもいろいろありそうだったので、ググるとやはり一杯ありました。
代田さんからは 権限最小化原則 を紹介いただき、すべての権限を与えるのではなく、必要な権限だけ付与していく、というのが重要です、とのことでした。
暗号化
最後にデータ盗難への対策、暗号化です。
通信の暗号化
まずはデータベースとの接続の暗号化です。
- アルゴリズムと鍵を使う
- アルゴリズムは AES が標準的
- 1 番最初の SSL リクエストで公開鍵を配布
- クライアント・サーバで共通鍵を使う
- pg_hba_conf の type 列で設定できます
- SSL を有効化 / 無効化する箇所
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a # plain TCP/IP socket.
- SSL を有効化 / 無効化する箇所
ちなみに接続を暗号化すると、通信量が結構増えます -> CPU 負荷も上がるとのことでした。
なるほど。やはり利便性とセキュリティはトレードオフの関係がありますね。
データの暗号化
続いてデータベース内部のデータやファイルの暗号化です。
今回はデータの暗号化を試してみます。
- データベース側で暗号化
- 透過的データ暗号化(TDE)
- ディスク/ファイルの暗号化
- 場合によってはファイルの暗号化のほうがよい
- やってみたいところだけど RDBMS で出来るオプションは有料になるので今回はやりません
- 透過的データ暗号化(TDE)
- アプリ側で INSERT や UPDATE 処理のときに暗号化する
- 通常はアプリ側で暗号処理を施すライブラリを使う
- RDBMS 側で設定して、アプリ側でその設定を呼び出すと暗号化出来る (PostgreSQL)
では、ハンズオンでやってみます。
バイナリ型の列をもつテーブル fruit2 を作ってみましょう。
create table fruit2(id serial,name bytea); --bytea型はバイナリ型
/* データを fruit から fruit2 にコピーして、表示してみます。*/
select * from fruit2;
id | name
----+----------------
1 | \x6170706c65
2 | \x6f7261676e65
3 | \x7065616368
(3 行)
続いて、列の暗号化をやってみましょう。
pgcrypto という拡張機能を有効化します。
なお通常はアプリ側からSQLを書きますが、今回はコマンドで update します。
/* 有効化 */
create extension pgcrypto;
/* 暗号化してデータを格納 */
update fruit2 SET name = encrypt(name, 'pass'::bytea, 'AES');
/* 復号化して表示 */
select convert_from(decrypt(name, 'pass'::bytea,'AES'),'UTF8') as name from fruit2;
ここまで行ったところで、このコースは修了しました。
まとめ
このコースではデータベースへの攻撃にはどのようなものがあるか解説頂いた上で、実際にハンズオンでどのように対策するのか確かめてみました。
億単位の規模で個人情報が流出するなど事故が相次ぎ、またビジネス側も BigQuery などを使ってデータベースを参照する時代なので、もっと何かいろんなことをやらねば、という気になってしまうのですが、基本は認証、認可 (権限設定)、暗号化であり、その手順と効果 (結果) を確認できて、とても良かったです。
「データベースのセキュリティは大丈夫か?」と言われたら、「大丈夫です」と言えるようになるコースでした!
label SE カレッジの無料見学、資料請求などお問い合わせはこちらから!!
label SEカレッジを詳しく知りたいという方はこちらから !!
IT専門の定額制研修 月額28,000円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 講座をほぼ毎日開催中!!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。