Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SELinuxで堅牢化する / selinux

Mako
January 15, 2022

SELinuxで堅牢化する / selinux

WASNight 2022 Kick-Off = OWASP x WASForum Night の Hardening Session での発表資料

Mako

January 15, 2022
Tweet

More Decks by Mako

Other Decks in Technology

Transcript

  1. SELinuxで堅牢化する
    H2021AF Team8, @tex2e
    2022/1/14

    View full-size slide

  2. SELinuxの検索上位ワード
    SELinuxと言えば...

    View full-size slide

  3. 通常のアクセス制御 (DAC)
    サブジェクト
    参照:https://opensource.com/business/13/11/selinux-policy-guide
    オブジェクト
    アクション

    View full-size slide

  4. 通常のアクセス制御 (DAC)
    サブジェクト
    参照:https://opensource.com/business/13/11/selinux-policy-guide
    オブジェクト
    アクション
    誰でもアクセスできる と、
    他人に食べられる
    (権限777などの設定ミス)
    犬の着ぐるみを被った狼 だったら、
    狼は不正にアクセスできる
    (管理者への権限昇格)

    View full-size slide

  5. SELinuxのアクセス制御 (MAC)
    サブジェクト
    参照:https://opensource.com/business/13/11/selinux-policy-guide
    オブジェクト
    ポリシー
    リファレンス
    モニター
    (RBAC; Role Based
    Access Control)
    (TE; Type Enforcement)
    アクション
    検証

    View full-size slide

  6. TE (Type Enforcement)
    「プロセス」に対してアクセス権限を割り当ててアクセス制御する
    参照:https://opensource.com/business/13/11/selinux-policy-guide
    「犬」が「キャットフード」を食べるのはポリシー違反

    View full-size slide

  7. Log4j2のRCE脆弱性に対する緩和
    参照:https://blogs.jpcert.or.jp/ja/2021/12/log4j-cve-2021-44228.html
    tomcat_t が *_port_t に tcp_socket name_connect
    (外部ポート接続) することは許可されているか?
    ↑ ※デフォルトは許可. TomcatのSecurityManagerを推奨
    tomcat_t が tomcat_*_t 以外に file read/write/execute
    (ファイル書込/実行) することは許可されているか?
    攻撃者
    やられサーバ

    View full-size slide

  8. Hardening競技環境での初期設定
    SELinuxは無効化されている
    SELinux=disabled

    View full-size slide

  9. Hardening競技環境での構成変更
    SELinuxを有効化して運用するまで(競技用)
    ~]# sed -ie 's/^SELINUX=disabled/SELINUX=permissive/' /etc/selinux/config
    ~]# reboot
    ~]# setenforce 1
    ~]# setsebool -P httpd_can_network_connect_db On
    ~]# setsebool -P httpd_can_sendmail On
    ~]# tail -f /var/log/audit/audit.log | grep "denied"
    ※復旧できるように起動時は permissive、起動後にsetenforceで有効化
    ※構成変更後は必要に応じて audit2allowコマンドでカスタムポリシーを作って適用

    View full-size slide

  10. 監査ログ:ファイル編集拒否
    [srv05] 2021/11/19 11:30:26
    type=AVC msg=audit(1637289026.349:218): avc: denied { write } for pid=2006
    comm="/usr/sbin/httpd" name="configure.php" dev="vda1" ino=139945
    scontext=system_u:system_r:httpd_t:s0
    tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=file permissive=0
    httpd(Webサーバ) が configure.php という名前のファイルに書き込みを試みたので拒否した
    - Webサーバ経由でのファイルの改ざん
    ● httpd_sys_content_t : 読み取りのみ
    ● httpd_sys_rw_content_t : 読み書き
    ● httpd_sys_script_exec_t : 実行

    View full-size slide

  11. 監査ログ:ファイル作成拒否
    [srv03] 2021/11/19 12:04:10
    type=AVC msg=audit(1637291050.436:129): avc: denied { write } for pid=1540
    comm="/usr/sbin/httpd" name="html" dev="vda1" ino=3018892
    scontext=system_u:system_r:httpd_t:s0
    tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir permissive=0
    httpd(Webサーバ) が html という名前のディレクトリの更新を試みたので拒否した
    - /var/www/html直下にWebShellファイルを新規作成
    1. dir write (ディレクトリの更新時間を編集) ← SELinuxはここで拒否した
    2. dir add_name (見出し追加)
    3. file create (新規作成)
    4. file write (内容書き込み)

    View full-size slide

  12. 監査ログ:外部ポートへの接続拒否
    [srv03] 2021/11/19 13:17:14
    type=AVC msg=audit(1637295434.210:277): avc: denied { name_connect } for
    pid=1538 comm="/usr/sbin/httpd" dest=3000
    scontext=system_u:system_r:httpd_t:s0
    tcontext=system_u:object_r:ntop_port_t:s0 tclass=tcp_socket permissive=0
    httpd(Webサーバ) が 3000番ポートにTCPコネクションを試みたので拒否した
    - RCEによるcurlやwgetなど
    ● 外部DB接続を許可したいときは、ブール値 httpd_can_network_connect_db を On にする

    View full-size slide

  13. 監査ログ:メール送信拒否
    [srv06] 2021/11/19 11:43:15
    type=AVC msg=audit(1637289795.813:393): avc: denied { read } for pid=2971
    comm="sendmail" name="main.cf" dev="vda1" ino=133340
    scontext=system_u:system_r:httpd_t:s0
    tcontext=system_u:object_r:postfix_etc_t:s0 tclass=file permissive=0
    sendmail(Webサーバ経由) が main.cf (postfix設定情報) のファイル読み込みを試みたので拒否した
    - RCEによるsendmailコマンドの実行など
    ● メール送信を許可したいときは、ブール値 httpd_can_sendmail を On にする

    View full-size slide

  14. 監査ログ:sshd改ざん後のログイン 1/2
    [srv02] 2021/11/19 13:59:41(user10, user11のパスワード変更作業漏れが原因)
    type=USER_AVC msg=audit(1637297981.555:302): pid=1 uid=0 auid=4294967295
    ses=4294967295 subj=system_u:system_r:kernel_t:s0 msg='avc: denied { start } for
    auid=n/a uid=0 gid=0 cmdline="/usr/lib/systemd/systemd-logind"
    scontext=system_u:system_r:kernel_t:s0 tcontext=system_u:system_r:kernel_t:s0
    tclass=service exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=?
    terminal=?'
    ユーザログインを管理するシステムサービス がkernet_tドメインのサービス起動を試みたので拒否
    - システム改ざん
    ● systemd_logind_exec_t : /usr/lib/systemd/systemd-logindファイルのデフォルトタイプ
    ● ユニットファイルが systemd_logind_exec_t 以外の lib_t などだったから拒否した?
    ● ドメインが systemd_logind_t 以外の kernel_t で動いていたから拒否した?

    View full-size slide

  15. 監査ログ:sshd改ざん後のログイン 2/2
    [srv02] 2021/11/19 13:59:41(user10, user11のパスワード変更作業漏れが原因)
    type=AVC msg=audit(1637297981.609:312): avc: denied { transition } for pid=8132
    comm="sshd" path="/usr/bin/bash" dev="vda3" ino=100664377
    scontext=system_u:system_r:kernel_t:s0
    tcontext=unconfined_u:unconfined_r:unconfined_t:s0 tclass=process permissive=0
    sshd が /usr/bin/bash を使って制限なし(unconfied_t)のプロセスを生成しようとしたので拒否した
    - システム改ざん
    ● /usr/bin/bash のタイプが shell_exec_t 以外の bin_t などだったから拒否した?

    View full-size slide

  16. まとめ
    初期設定でセキュリティを有効化する戦略 (Secure by Default) によって、
    新しい技術には標準で組み込みセキュリティ (Built-In Security) が含まれている。
    - IPv6 : IPsec
    - HTTP3 (QUIC) : TLS 1.3
    - Windows 10 : Windows Defender (WDAC)
    - Windows 11 : TPM 2.0 + Secure Boot
    - Docker : Limit Kernel Capabilities
    - CentOS 4〜 : SELinux
    - Android 4.4〜 : SELinux
    組み込みセキュリティを活用しよう! (SELinux無効化しないで使おう!)

    View full-size slide

  17. A1. SELinuxで守れないもの
    - rootアカウントの保護
    - 権限が奪取された場合はアクセス制限できるが、パスワードそのものが漏洩した場合はアクセス制限
    できない
    - DoS攻撃
    - リソースの消費が激しいリクエストや内部エラーによるサービス停止は防げない
    - Webアプリケーション特有の問題
    - SQLi, XSS, XSRF などは防げない

    View full-size slide

  18. A2. unconfined_t(制限なしのタイプ)
    デフォルトでSELinuxはユーザを制限していないので、パスワードが漏洩すると大問題になる
    ~]# semanage login -l
    Login Name SELinux User MLS/MCS Range Service
    __default__ unconfined_u s0-s0:c0.c1023 *
    root unconfined_u s0-s0:c0.c1023 *

    View full-size slide