51
データベースセキュリティの基礎 Kazuki Omo( 和毅 ): [email protected] SIOS Technology, Inc.

Postgre SQL security_20170412

Embed Size (px)

Citation preview

Page 1: Postgre SQL security_20170412

データベースセキュリティの基礎

Kazuki Omo(  面 和毅 ): [email protected]

SIOS Technology, Inc.

Page 2: Postgre SQL security_20170412

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/

Page 3: Postgre SQL security_20170412

3

アジェンダ

1. データベースセキュリティのガイドライン2. OSS での実装を考える

2. 1 OS レベルでのセキュリティ実装を考える2. 2 DBMS でのセキュリティ実装を考える2.3 監査の実装を考える

3. まとめ

Page 4: Postgre SQL security_20170412

1. データベースセキュリティのガイドライン

Page 5: Postgre SQL security_20170412

5

DBのセキュリティ標準

DataBase Security Consortium

スタンダードについて色々やってます。

Page 6: Postgre SQL security_20170412

6

DB ガイドラインを にする内部不正対策 参考

Page 7: Postgre SQL security_20170412

7

DB ガイドライン内部不正対策

4. 管理者の抑制

4.1 アクセス制御4.2 認証方式4.3 管理者の分掌4.4 暗号化・鍵管理4.5 DB 周辺デバイスの 管理

Page 8: Postgre SQL security_20170412

8

DB ガイドライン内部不正対策

5.1 ポリシーの制定5.2 保全5.3 監査・監視体制5.4 監査の実施

5. 運用の実施

Page 9: Postgre SQL security_20170412

9

4. 管理者の抑制  システムで出来ること

アクセス制御● OS上のファイル・ディレクトリへのきっちりしたアクセス

権の設定● DBA権限のきっちりした取扱い● 各DBアカウントへの必要なだけの権限付与● 機密情報へのアクセスの制限認証方式● パスワードポリシー● 二因子認証(多要素認証)

Page 10: Postgre SQL security_20170412

10

4. 管理者の抑制  システムで出来ること

暗号化・鍵管理● DB暗号化やデータマスキング● クエリ発行通路の暗号化周辺デバイス● ネットワークセグメントへのアクセス制限(ACL等)● 物理コンソールの制限● DB暗号化やデータマスキング

Page 11: Postgre SQL security_20170412

11

5. 運用の実施システムで出来ること

保全● アクセスログの収集・保全監査● 監査証跡のレポート● アラートの出力● ポリシーから外れた操作・アクセス履歴のログ● 管理者アカウントの操作・アクセス履歴のログ● セキュリティ設定の変更の取得

Page 12: Postgre SQL security_20170412

12

2. OSSでの を える実装 考

Page 13: Postgre SQL security_20170412

13

2. 1 OS/Softwareレベルでのセキュリティ を える 実装 考

Page 14: Postgre SQL security_20170412

14

DBサーバのセキュリティ担保

4.1.2 ファイル、ディレクトリ等のアクセス制限

さあ、 SELinuxだ!

Page 15: Postgre SQL security_20170412

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

Page 16: Postgre SQL security_20170412

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

Page 17: Postgre SQL security_20170412

17

PostgreSQL 自身のセキュリティに気をつける

Page 18: Postgre SQL security_20170412

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)

Page 19: Postgre SQL security_20170412

19

PostgreSQL 自身のセキュリティに気をつける

定期的に PostgreSQLのサイトをチェックする

Page 20: Postgre SQL security_20170412

20

PostgreSQL 自身のセキュリティに気をつける

ディストリビューション提供のものを使っている場合にはディストリビューションのエラータ情報(メール)などをチェックする

Page 21: Postgre SQL security_20170412

21

2. 2 DBMSでのセキュリティ を える実装 考

Page 22: Postgre SQL security_20170412

22

じゃあ、 は次 DBMSのセキュリティだ

Page 23: Postgre SQL security_20170412

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 暗号化及び権限の管理

データの暗号化・匿名化 ○ ○

Page 24: Postgre SQL security_20170412

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 暗号化及び権限の管理

データの暗号化・匿名化 ○ ○

Page 25: Postgre SQL security_20170412

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 暗号化及び権限の管理

データの暗号化・匿名化 ○ ○

Page 26: Postgre SQL security_20170412

26

DBのセキュリティ

キーコンポーネント●データの暗号化・匿名化

● SQLの細かな制御 (DBFW)

Page 27: Postgre SQL security_20170412

27

DBのセキュリティ

キーコンポーネント●データの暗号化・匿名化

● SQLの細かな制御 (DBFW)

Page 28: Postgre SQL security_20170412

28

DBサーバを っててもアプリが けがあると守 抜

(例 ) SQLインジェクション

作りが甘いと、最新のパッケージにしてもデータが見られる・抜かれる

Page 29: Postgre SQL security_20170412

29

DBサーバを っててもアプリが けがあると守 抜

外部ユーザ

( 例 ) SQL インジェクションアプリの作りが甘いと、最新のパッケージにしてもデータが見られる・抜かれる

172.16.148.130

Demo

Page 30: Postgre SQL security_20170412

30

DB Firewall (SQL の かな文実行 細 制御 )

App

外部ユーザ

AllowBlock

● ホワイト /ブラックリスト方式選択可能

● SQL文法の解析● オーバーヘッドを極力抑える

OSS: PostgreSQL用 SQLファイアーウォール「 sql_firewall」

NginxなどのWAFでも最近は防げる

172.16.148.130

172.16.148.128

Page 31: Postgre SQL security_20170412

31

アプリを しても のものに が つかると対策 別 脆弱性 見

(例 ) Struts2の脆弱性 (CVE-2017-5638)

SQLインジェクション対策をしていても、Struts2のゼロデイ脆弱性で、直接 SQLを実行されてデータが見られる・抜かれる

Demo

データは平文だと困る

Page 32: Postgre SQL security_20170412

32

DBのセキュリティ

キーコンポーネント●データの暗号化・匿名化

● SQLの細かな制御 (DBFW)

Page 33: Postgre SQL security_20170412

33

DBの暗号化

製品名 アルゴリズム 鍵サイズ

Oracle Advanced Security 12g Rel1 DES 168bits

AES(表領域Default) 128bits

AES(列レベルDefault) 192bits

AES 256bits

pgcrypto with OpenSSL DES 168bits

AES 256bits

Page 34: Postgre SQL security_20170412

34

DBの暗号化 (理想 )

DBMS_CRYPTO

pgcrypto

App

データ盗難

内部の不正者

HSM

長所● 安全性が高い

短所● アプリケーションに改修が必要● 移行性が低下する● 性能劣化の懸念

メモリ

Page 35: Postgre SQL security_20170412

35

DBの暗号化 (Transparent Data Encryption: TDE)

App

暗号化あり 暗号化無し

メモリ

暗号化 /復号化

見えるので DB Firewallで防ぐ

内部の不正者

触れるので ACLで防ぐ

ACL

長所● アプリケーションは改修不要● 移行性の高い SQL● 性能劣化は最小限( DBが担当 )● 鍵は DB側で管理

短所● 安全性の低下

(DB Firewall, ACL, 特権管理などその他の機能/製品を組み合わせて補う )

DBFirewall

参考: Oracle TDE

Page 36: Postgre SQL security_20170412

36

DBの暗号化 (File System との い暗号化 違 )

メモリ

OSユーザからも暗号化で見えない

メモリ

OSのユーザからは平文で見える

内部ユーザの脅威への対応

Struts2など直接SQLを実行された時の対応

参考: Oracle TDE(例 ) Struts2の脆弱性 (CVE-2017-5638)

Page 37: Postgre SQL security_20170412

37

じゃあ、Struts2の で してた脆弱性 暗号化 場合

(例 ) Struts2の脆弱性 (CVE-2017-5638)

Struts2のゼロデイ脆弱性で、直接 SQLを実行されてデータが見られる・抜かれるが暗号化していた場合にはどうなるか

Demo

結局、データは極力暗号化しといたほうが良い

Page 38: Postgre SQL security_20170412

38

でもDB しててもアプリが けがあると暗号化 抜

外部ユーザ

( 例 ) SQL インジェクションアプリの作りが甘いと、暗号化しててもデータが見られる・抜かれる

172.16.148.130

Demo

Page 39: Postgre SQL security_20170412

39

は結局

・インジェクションなどの対策だけでもダメ

・暗号化だけでもダメ

両方を組み合わせることで意味がある

Page 40: Postgre SQL security_20170412

40

2. 3 の を える監査 実装 考

Page 41: Postgre SQL security_20170412

41

じゃあ、 は次 DBの だ監査

Page 42: Postgre SQL security_20170412

42

DB/OSの監査

SIEMやフォレンジック製品と連動させる

・監査ログが確実に出るようにする( OS側の実装・設定)

・ SQLの実行元・実行内容などを細かく保存する・ログなどは改変不可なように別筐体に入れる

モニタリングツール(外だし)の必要性

● DAM(Database Activity Monitoring)

Page 43: Postgre SQL security_20170412

43

DAM(Database Access Monitoring)

リアルタイムに、 SQLでの全ての操作を検出し記録

●複数 DBプラットフォームを横断する DB管理者の活動をとらえポリシー違反に対して警告

● SQL インジェクション攻撃も警告

●エージェント/情報収集サーバ構成

「誰が」「いつ」「どこから」「何に」「何を」「結果は」

Page 44: Postgre SQL security_20170412

44

DAM(Database Access Monitoring)

44

App

外部ユーザ

システム管理者

監査ログ

● Oracle Database Firewall and Audit Vault● IMPREVA SecureSphere Database Activity Monitor… etc.

DBMSは監査ログがきちんと出力されるようにする(パフォーマンスと兼ね合い)

Page 45: Postgre SQL security_20170412

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

Page 46: Postgre SQL security_20170412

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')"}

Page 47: Postgre SQL security_20170412

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

Page 48: Postgre SQL security_20170412

48

ログを めたらどうするか集

一般的には SIEMなどの予兆検知ツール等と連動可視化して、きちんとログを役立てる

Splunk

Arcsight

Page 49: Postgre SQL security_20170412

49

3. まとめ

Page 50: Postgre SQL security_20170412

50

まとめ

ネットワーク/ OSレベルでもセキュリティを保つ● 適切な設計・制御を行う/通信の暗号化は必須 !!

● SELinuxは有効化しましょう!!● (難しいだろうけれど )パッケージは最新にしましょう。DBのセキュリティ● 適切な設計・制御を行う● DB Firewallの導入を検討( DAM製品と通常一体化)● 可能ならば重要なデータは暗号化を検討。● モニタリングのための監査ログも検討(パフォーマンスと兼ね合い)。● ログは集めたら可視化・ SIEM等とも連動。取りっぱなしでは勿体無い。

Page 51: Postgre SQL security_20170412

51

Thank You!!!