postgre sql security_20170412
Post on 22-Jan-2018
112 Views
Preview:
TRANSCRIPT
2
Who am I ?
- Security Researcher/Engineer (16 years)
- SELinux/MAC Evangelist (11 years)
- Antivirus Engineer (3 years)
- SIEM Engineer (3 years)
- Linux Engineer (16 years)
OSS セキュリティ技術の会 (3 月発足 )http://www.secureoss.jp/
3
アジェンダ
1. データベースセキュリティのガイドライン2. OSS での実装を考える
2. 1 OS レベルでのセキュリティ実装を考える2. 2 DBMS でのセキュリティ実装を考える2.3 監査の実装を考える
3. まとめ
1. データベースセキュリティのガイドライン
5
DBのセキュリティ標準
DataBase Security Consortium
スタンダードについて色々やってます。
6
DB ガイドラインを にする内部不正対策 参考
7
DB ガイドライン内部不正対策
4. 管理者の抑制
4.1 アクセス制御4.2 認証方式4.3 管理者の分掌4.4 暗号化・鍵管理4.5 DB 周辺デバイスの 管理
8
DB ガイドライン内部不正対策
5.1 ポリシーの制定5.2 保全5.3 監査・監視体制5.4 監査の実施
5. 運用の実施
9
4. 管理者の抑制 システムで出来ること
アクセス制御● OS上のファイル・ディレクトリへのきっちりしたアクセス
権の設定● DBA権限のきっちりした取扱い● 各DBアカウントへの必要なだけの権限付与● 機密情報へのアクセスの制限認証方式● パスワードポリシー● 二因子認証(多要素認証)
10
4. 管理者の抑制 システムで出来ること
暗号化・鍵管理● DB暗号化やデータマスキング● クエリ発行通路の暗号化周辺デバイス● ネットワークセグメントへのアクセス制限(ACL等)● 物理コンソールの制限● DB暗号化やデータマスキング
11
5. 運用の実施システムで出来ること
保全● アクセスログの収集・保全監査● 監査証跡のレポート● アラートの出力● ポリシーから外れた操作・アクセス履歴のログ● 管理者アカウントの操作・アクセス履歴のログ● セキュリティ設定の変更の取得
12
2. OSSでの を える実装 考
13
2. 1 OS/Softwareレベルでのセキュリティ を える 実装 考
14
DBサーバのセキュリティ担保
4.1.2 ファイル、ディレクトリ等のアクセス制限
さあ、 SELinuxだ!
15
4. RHEL 7 / CentOS 7 上での MySQL
[root@cent7 services]# getenforceEnforcing[root@cent7 services]# ps axZ |grep mysqlsystem_u:system_r:mysqld_safe_t:s0 11998 ? Ss 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usrsystem_u:system_r:mysqld_t:s0 12203 ? Sl 0:00 /usr/libexec/mysqld –basedir=/usr
--datadir=/var/lib/mysql …..[root@cent7 services]# ls -lZ /etc/my.cnf-rw-r--r--. root root system_u:object_r:mysqld_etc_t:s0 /etc/my.cnf
[root@cent7 services]# ls -lZ /usr/libexec/mysqld -rwxr-xr-x. root root system_u:object_r:mysqld_exec_t:s0 /usr/libexec/mysqld
16
4. RHEL 7 / CentOS 7 上での PostgreSQL
[root@cent7 ~]# getenforceEnforcing[root@cent7 ~]# ps axZ|grep -i postgresy st em_u:sys t em_r:pos tgresql_t: s0 3483 ? S 0:00 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432syst em_u:sys t em_r:pos tgresql_t: s0 3484 ? Ss 0:00 postgres: logger process sy st em_u:sys t em_r:pos tgresql_t: s0 3486 ? Ss 0:00 postgres: checkpointer process sy st em_u:sys t em_r:pos tgresql_t: s0 3487 ? Ss 0:00 postgres: writer process sy st em_u:sys t em_r:pos tgresql_t: s0 3488 ? Ss 0:00 postgres: wal writer process sy st em_u:sys t em_r:pos tgresql_t: s0 3489 ? Ss 0:00 postgres: autovacuum launcher process sy st em_u:sys t em_r:pos tgresql_t: s0 3490 ? Ss 0:00 postgres: stats collector process
[root@cent7 ~]# ls -lZ /usr/bin/postgres-rwxr-xr-x. root root sys t em_u:object_r:pos tgre sql_exec_t: s0 /usr/bin/postgres
[root@cent7 ~]# ls -lZ /var/lib/pgsql/drwx------. postgres postgres sys t em_u:object_r:pos tgre sql_db_t: s0 backupsdrwx------. postgres postgres sys t em_u:object_r:pos tgre sql_db_t: s0 data
17
PostgreSQL 自身のセキュリティに気をつける
18
PostgreSQL 自身のセキュリティに気をつける
CVE-2016-5424 (2016/08/11)
PostgreSQL 9.1.23 未満 PostgreSQL 9.2.18 未満の 9.2.x PostgreSQL 9.3.14 未満の 9.3.x PostgreSQL 9.4.9 未満の 9.4.x PostgreSQL 9.5.4 未満の 9.5.x
PostgreSQL におけるスーパーユーザ権限を取得される脆弱性
CVE-2016-0773 (2016/02/11)
PostgreSQL 9.1.20 未満 PostgreSQL 9.2.15 未満の 9.2.x PostgreSQL 9.3.11 未満の 9.3.x PostgreSQL 9.4.6 未満の 9.4.x PostgreSQL 9.5.1 未満の 9.5.x
リモートからのサービス運用妨害 (DoS)
19
PostgreSQL 自身のセキュリティに気をつける
定期的に PostgreSQLのサイトをチェックする
20
PostgreSQL 自身のセキュリティに気をつける
ディストリビューション提供のものを使っている場合にはディストリビューションのエラータ情報(メール)などをチェックする
21
2. 2 DBMSでのセキュリティ を える実装 考
22
じゃあ、 は次 DBMSのセキュリティだ
23
それぞれの と項目 実装
項目 対策 MySQL PostgreSQL
4.1.1 DBA 権限の適切な付与
管理者以外にDB管理者権限を付与しない ○ ○
4.1.3 一般利用者アカウントのアクセス制限
業務上必要なデータのみへのアクセス権 ○ ○
4.1.4 管理者アカウントのアクセス制限
DB管理者は必要なデータ以外へのアクセスを制限
○ ○
4.1.5 カラム、テーブルへのアカウント制限
カラム、テーブルごとにアクセスできるアカウントを制限
○ ○
4.1.6 カラム、テーブルへの属性制限
カラム、テーブルごとにアクセスできる時間帯を制限
DBFW DBFW
4.2.5 システム利用アカウント等の管理
ビルトインで不要なアカウントのロックアウト
○ ○
4.4.1 暗号化及び権限の管理
データの暗号化・匿名化 ○ ○
24
それぞれの と項目 実装 ( で設定 実現 )
項目 対策 MySQL PostgreSQL
4.1.1 DBA 権限の適切な付与
管理者以外にDB管理者権限を付与しない ○ ○
4.1.3 一般利用者アカウントのアクセス制限
業務上必要なデータのみへのアクセス権 ○ ○
4.1.4 管理者アカウントのアクセス制限
DB管理者は必要なデータ以外へのアクセスを制限
○ ○
4.1.5 カラム、テーブルへのアカウント制限
カラム、テーブルごとにアクセスできるアカウントを制限
○ ○
4.1.6 カラム、テーブルへの属性制限
カラム、テーブルごとにアクセスできる時間帯を制限
DBFW DBFW
4.2.5 システム利用アカウント等の管理
ビルトインで不要なアカウントのロックアウト
○ ○
4.4.1 暗号化及び権限の管理
データの暗号化・匿名化 ○ ○
25
それぞれの と が項目 実装(機能 必要)
項目 対策 MySQL PostgreSQL
4.1.1 DBA 権限の適切な付与
管理者以外にDB管理者権限を付与しない ○ ○
4.1.3 一般利用者アカウントのアクセス制限
業務上必要なデータのみへのアクセス権 ○ ○
4.1.4 管理者アカウントのアクセス制限
DB管理者は必要なデータ以外へのアクセスを制限
○ ○
4.1.5 カラム、テーブルへのアカウント制限
カラム、テーブルごとにアクセスできるアカウントを制限
○ ○
4.1.6 カラム、テーブルへの属性制限
カラム、テーブルごとにアクセスできる時間帯を制限
DBFW DBFW
4.2.5 システム利用アカウント等の管理
ビルトインで不要なアカウントのロックアウト
○ ○
4.4.1 暗号化及び権限の管理
データの暗号化・匿名化 ○ ○
26
DBのセキュリティ
キーコンポーネント●データの暗号化・匿名化
● SQLの細かな制御 (DBFW)
27
DBのセキュリティ
キーコンポーネント●データの暗号化・匿名化
● SQLの細かな制御 (DBFW)
28
DBサーバを っててもアプリが けがあると守 抜
(例 ) SQLインジェクション
作りが甘いと、最新のパッケージにしてもデータが見られる・抜かれる
29
DBサーバを っててもアプリが けがあると守 抜
外部ユーザ
( 例 ) SQL インジェクションアプリの作りが甘いと、最新のパッケージにしてもデータが見られる・抜かれる
172.16.148.130
Demo
30
DB Firewall (SQL の かな文実行 細 制御 )
App
外部ユーザ
AllowBlock
● ホワイト /ブラックリスト方式選択可能
● SQL文法の解析● オーバーヘッドを極力抑える
OSS: PostgreSQL用 SQLファイアーウォール「 sql_firewall」
NginxなどのWAFでも最近は防げる
172.16.148.130
172.16.148.128
31
アプリを しても のものに が つかると対策 別 脆弱性 見
(例 ) Struts2の脆弱性 (CVE-2017-5638)
SQLインジェクション対策をしていても、Struts2のゼロデイ脆弱性で、直接 SQLを実行されてデータが見られる・抜かれる
Demo
データは平文だと困る
32
DBのセキュリティ
キーコンポーネント●データの暗号化・匿名化
● SQLの細かな制御 (DBFW)
33
DBの暗号化
製品名 アルゴリズム 鍵サイズ
Oracle Advanced Security 12g Rel1 DES 168bits
AES(表領域Default) 128bits
AES(列レベルDefault) 192bits
AES 256bits
pgcrypto with OpenSSL DES 168bits
AES 256bits
34
DBの暗号化 (理想 )
DBMS_CRYPTO
pgcrypto
App
データ盗難
内部の不正者
HSM
長所● 安全性が高い
短所● アプリケーションに改修が必要● 移行性が低下する● 性能劣化の懸念
メモリ
35
DBの暗号化 (Transparent Data Encryption: TDE)
App
暗号化あり 暗号化無し
メモリ
暗号化 /復号化
見えるので DB Firewallで防ぐ
内部の不正者
触れるので ACLで防ぐ
ACL
長所● アプリケーションは改修不要● 移行性の高い SQL● 性能劣化は最小限( DBが担当 )● 鍵は DB側で管理
短所● 安全性の低下
(DB Firewall, ACL, 特権管理などその他の機能/製品を組み合わせて補う )
DBFirewall
参考: Oracle TDE
36
DBの暗号化 (File System との い暗号化 違 )
メモリ
OSユーザからも暗号化で見えない
メモリ
OSのユーザからは平文で見える
内部ユーザの脅威への対応
Struts2など直接SQLを実行された時の対応
参考: Oracle TDE(例 ) Struts2の脆弱性 (CVE-2017-5638)
37
じゃあ、Struts2の で してた脆弱性 暗号化 場合
(例 ) Struts2の脆弱性 (CVE-2017-5638)
Struts2のゼロデイ脆弱性で、直接 SQLを実行されてデータが見られる・抜かれるが暗号化していた場合にはどうなるか
Demo
結局、データは極力暗号化しといたほうが良い
38
でもDB しててもアプリが けがあると暗号化 抜
外部ユーザ
( 例 ) SQL インジェクションアプリの作りが甘いと、暗号化しててもデータが見られる・抜かれる
172.16.148.130
Demo
39
は結局
・インジェクションなどの対策だけでもダメ
・暗号化だけでもダメ
両方を組み合わせることで意味がある
40
2. 3 の を える監査 実装 考
41
じゃあ、 は次 DBの だ監査
42
DB/OSの監査
SIEMやフォレンジック製品と連動させる
・監査ログが確実に出るようにする( OS側の実装・設定)
・ SQLの実行元・実行内容などを細かく保存する・ログなどは改変不可なように別筐体に入れる
モニタリングツール(外だし)の必要性
● DAM(Database Activity Monitoring)
43
DAM(Database Access Monitoring)
リアルタイムに、 SQLでの全ての操作を検出し記録
●複数 DBプラットフォームを横断する DB管理者の活動をとらえポリシー違反に対して警告
● SQL インジェクション攻撃も警告
●エージェント/情報収集サーバ構成
「誰が」「いつ」「どこから」「何に」「何を」「結果は」
44
DAM(Database Access Monitoring)
44
App
外部ユーザ
システム管理者
監査ログ
● Oracle Database Firewall and Audit Vault● IMPREVA SecureSphere Database Activity Monitor… etc.
DBMSは監査ログがきちんと出力されるようにする(パフォーマンスと兼ね合い)
45
じゃあ、OSSはないの?
MySQL: McAfee MySQL Audit Plugin
(https://github.com/mcafee/mysql-audit)
{"msg-type":"activity","date":"1480477660581","thread-id":"1","query-id":"0","user":"sios","priv_user":"sios","host":"router","ip":"172.16.148.1","cmd":"Connect","query":"Connect"}{"msg-type":"activity","date":"1480477660582","thread-id":"1","query-id":"6","user":"sios","priv_user":"sios","host":"router","ip":"172.16.148.1","cmd":"show_grants","query":"SHOW GRANTS"}{"msg-type":"activity","date":"1480477660626","thread-id":"1","query-id":"9","user":"sios","priv_user":"sios","host":"router","ip":"172.16.148.1","cmd":"select","query":"SELECT
46
MySQLのCVE-2016-6662 の攻撃 例
--snip--
000000000098280000000000004e03000000000000000000000000000001000000000000000000000000000000\") INTO DUMPFILE '/var/lib/mysql/mysql_hookandroot_lib.so'"}
{"msg-type":"activity","date":"1480484785741","thread-id":"2","query-id":"25","user":"attackertest","priv_user":"attackertest","host":"router","ip":"172.16.148.1","cmd":"insert","objects":[{"db":"poctestdb","name":"poctable","obj_type":"TABLE"}],"query":"INSERT INTO `poctable` VALUES('execute the trigger!')"}
{"msg-type":"activity","date":"1480484785741","thread-id":"2","query-id":"29","user":"attackertest","priv_user":"attackertest","host":"router","ip":"172.16.148.1","cmd":"select","query":"select \"\n\n# 0ldSQL_MySQL_RCE_exploit got here :)\n\n[mysqld]\nmalloc_lib='/var/lib/mysql/mysql_hookandroot_lib.so'\n\n[abyss]\n\" INTO void"}
{"msg-type":"activity","date":"1480484785742","thread-id":"2","query-id":"33","user":"attackertest","priv_user":"attackertest","host":"router","ip":"172.16.148.1","cmd":"select","query":"SELECT load_file('/etc/my.cnf')"}
47
じゃあ、OSSはないの?
PostgreSQL: PGAudit
(http://pgaudit.org/)
AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.account,select password from accountAUDIT: OBJECT,2,1,WRITE,UPDATE,TABLE,public.account,update account set password = 'HASH2'AUDIT: OBJECT,3,1,READ,SELECT,TABLE,public.account,select account.password, account_role_map.role_id from account inner join account_role_map on account.id = account_role_map.account_idAUDIT: OBJECT,3,1,READ,SELECT,TABLE,public.account_role_map,select account.password, account_role_map.role_id from account inner join account_role_map on account.id = account_role_map.account_id
48
ログを めたらどうするか集
一般的には SIEMなどの予兆検知ツール等と連動可視化して、きちんとログを役立てる
Splunk
Arcsight
49
3. まとめ
50
まとめ
ネットワーク/ OSレベルでもセキュリティを保つ● 適切な設計・制御を行う/通信の暗号化は必須 !!
● SELinuxは有効化しましょう!!● (難しいだろうけれど )パッケージは最新にしましょう。DBのセキュリティ● 適切な設計・制御を行う● DB Firewallの導入を検討( DAM製品と通常一体化)● 可能ならば重要なデータは暗号化を検討。● モニタリングのための監査ログも検討(パフォーマンスと兼ね合い)。● ログは集めたら可視化・ SIEM等とも連動。取りっぱなしでは勿体無い。
51
Thank You!!!
top related