SELinuxの基本概念と基本配置

19321 ワード

SELinuxは現れてから今まで、すでに13年近くの歴史を歩んできたが、Linux関連QQ技術群やLinux関連フォーラムでは、httpdのような各構成は正常だが、お客様はアクセスできないことが多い.また、vsftpdの構成は正常ですが、クライアントアクセスプロンプトではホームディレクトリを変換できません.そこで多くの人がSELinuxに対して大きな偏見を持っていて、SELinuxがもたらしたのは面倒なようだと思っています.そこで、多くの人がシステムをインストールする最初のことはSELinuxを無効にすることです.しかし、0-dayセキュリティの脆弱性が増加するにつれて、SELinuxは多くの場合、私たちに重要な保障を与えています.

SELinuxとは?


SELinux全称Security Enhanced Linux(セキュリティ強化Linux)は、米国国家安全保障局が2000年にGNU GPLで発表したMAC(Mandatory Access Control、強制アクセス制御システム)の実現であり、あるプロセスがどのソース(ファイル、ネットワークポートなど)にアクセスできるかを明確に示すことを目的としている.強制アクセス制御システムの用途は、0-Day攻撃(未公開の脆弱性を利用した攻撃行為)を防ぐシステムの能力を強化することにある.そのため、ネットワークファイアウォールやACLの代替品ではなく、用途でも繰り返しません.現在のほとんどのリリースでは、デフォルトではカーネルにSELinuxが統合されています.
たとえば、システム上のApacheには、リモート・ユーザーがシステム上の機密ファイル(例えば/etc/passwd)にアクセスできるようにする脆弱性が発見され、セキュリティ・ホールを修復するApache更新パッチはまだ解放されていない.このときSELinuxは,この脆弱性を補う緩和策として機能する./etc/passwdはApacheのアクセスラベルを持たないため、/etc/passwdに対するApacheのアクセスはSELinuxによってブロックされます.SELinuxは、他の強制的なアクセス制御システムに比べて、次のようなメリットがあります.
  • 制御ポリシーは、プログラムが表示されないのではなく、クエリー可能である.
  • は、サービスを再起動または停止することなく、ポリシーを熱的に変更することができる.
  • は、プロセス初期化、継承、およびプログラム実行の3つの態様からポリシーによって制御することができる.
  • 制御範囲は、ファイルシステム、ディレクトリ、ファイル、ファイル起動記述子、ポート、メッセージインタフェース、およびネットワークインタフェースをカバーする.
  • では、SELinuxはシステムのパフォーマンスにどのような影響を及ぼしますか?Phoronixが2009年にFedora 11を用いた横比較から見ると,オンSELinuxは少数の場合にシステム性能の約5%の低下をもたらした.

  • SELinuxは一般的なデスクトップアプリケーションやプログラム開発に非常に影響するのではないでしょうか.なぜなら、SELinuxのポリシーは主にサーバ環境を対象としているからです.しかし、SELinuxの13年間の広範な応用に伴い、現在、SELinux戦略は一般的なデスクトップとプログラム開発環境の下で依然として安全性と利便性の要求を同時に満たすことができる.発表されたばかりのFedora 15を例にとると、筆者は完全な娯楽(複数のサードパーティ原生LinuxゲームやWineゲームを含む)や開発環境(Android SDK+Eclipse)を構築する過程で、Wineプログラムの初回実行時のみSELinuxデフォルトポリシーに阻まれ、グラフィック化された「SELinuxトラブルシューティングプログラム」の助けでボタンをクリックするだけで解決した.

    SELinuxの理解と構成


    1.現在のSELinux運転状態を取得する


    getenforce
    結果を返すには、Enforcing、Permissive、Disabledの3つがあります.DisabledはSELinuxを表し、Permissiveはセキュリティ警告のみを記録し、不審な行為を阻止しないことを表し、Enforcingは警告を記録し、不審な行為を阻止することを表す.
    現在一般的なリリース版では、RHEL、CentOS、FedoraなどがデフォルトでEnforcingに設定されており、残りはOpenSUSEなどがPermissiveとなっている.

    2.SELinux運転状態の変更


    setenforce [ Enforcing | Permissive | 1 | 0 ]
    このコマンドはすぐにSELinuxの運転状態を変更し、EnforcingとPermissiveの間を切り替え、結果的にシャットダウンに保つことができます.典型的な用途は、SELinuxがサービスまたはプログラムを実行できないかどうかを確認することです.setenforce 0以降もサービスやプログラムが実行できない場合は、SELinuxによるものではないことは間違いありません.
    システムSELinux実行環境を永続的に変更する場合は、プロファイル/etc/selinux/configを変更することで実現できます.注意DisabledからPermissiveまたはEnforcingモードに切り替えると、コンピュータを再起動し、ファイルシステム全体にセキュリティラベルを再作成する必要があります(touch/.autorelabel&&reboot).
    [root@web2 ~]# vim /etc/selinux/config
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    # enforcing - SELinux security policy is enforced.
    # permissive - SELinux prints warnings instead of enforcing.
    # disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these two values:
    # targeted - Targeted processes are protected,
    # mls - Multi Level Security protection.
    SELINUXTYPE=targeted

    3.SELinux実行ポリシー


    プロファイル/etc/selinux/configには、変数SELINUXTYPEの値を変更することによって実現されるSELinux実行ポリシーの情報も含まれています.targetedは、事前に作成されたいくつかのネットワークサービスとアクセス要求に対してのみSELinux保護を使用し、strictはすべてのネットワークサービスとアクセス要求がSELinuxを通過することを意味します.
    RHEL、CentOS、Fedoraなどのデフォルト設定はtargetedで、ほとんどの一般的なネットワークサービスに対するSELinuxポリシー構成が含まれており、デフォルトでインストールされており、変更することなく直接使用できます.SELinuxポリシーを自分で編集したい場合は、コマンドラインのポリシーエディタseeditおよびEclipseの編集プラグインeclipse-slideも用意されています.

    4.coreutilsツールのSELinuxモード


    一般的なcoreutilsに属するツール、例えばps、lsなどは、Zオプションを追加することでSELinuxに関する情報を知ることができます.

    4.1 psを使用して取得:

    [barlow@web1 ~]$ ps -auxZ |grep httpd |head -5
    
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ unconfined_u:system_r:httpd_t:s0 apache 1393 0.0 0.2 279648 2272 ? S Jun27 0:01 /usr/sbin/httpd unconfined_u:system_r:httpd_t:s0 apache 1395 0.0 1.5 272964 15528 ? S Jun27 0:02 /usr/sbin/httpd unconfined_u:system_r:httpd_t:s0 apache 1399 0.0 1.7 272964 17828 ? S Jun27 0:02 /usr/sbin/httpd unconfined_u:system_r:httpd_t:s0 apache 1405 0.0 1.2 272964 12732 ? S Jun27 0:02 /usr/sbin/httpd unconfined_u:system_r:httpd_t:s0 apache 1409 0.0 1.4 272968 14784 ? S Jun27 0:03 /usr/sbin/httpd

    4.2 ls取得の使用

    [barlow@web1 ~]$ ls -Z /var/www/ drwxrwxrwx. apache barlow unconfined_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin drwxrwxrwx. apache barlow unconfined_u:object_r:httpd_sys_content_t:s0 error drwxrwxrwx. apache barlow unconfined_u:object_r:httpd_sys_content_t:s0 html drwxrwxrwx. apache barlow unconfined_u:object_r:httpd_sys_content_t:s0 icons drwxrwxrwx. apache barlow system_u:object_r:httpd_sys_content_t:s0 lost+found

    このようにZオプションは、ほとんどのcoreutilsツールに適用できます.

    5.httpdサービスに関するSELinuxポリシーの変更方法をよく使う:


    以上のように、ls-ZメソッドでクエリされたファイルSELinuxコンテキストがデフォルトの要件と一致しないと、SELinuxがhttpサービスを要求するWebディレクトリやファイルのコンテキストがhttp_sys_content_t,そうでなければクライアントはアクセスできない.

    5.1 chconを使用してhttpdディレクトリまたはファイルセキュリティコンテキストを変更します。


    NagiosサーバのWebディレクトリコンテキストのデフォルトはunconfined_です.u:object_r:usr_t:s 0の場合、クライアントはアクセスできません.
    [root@nagios ~]# ll -Z /usr/local/nagios/share/
    
    -rwxrwxr-x. nagios apache system_u:object_r:usr_t:s0 config.inc.php
    drwxrwxr-x. nagios apache unconfined_u:object_r:usr_t:s0 contexthelp
    drwxrwxr-x. nagios apache unconfined_u:object_r:usr_t:s0 docs
    drwxrwxr-x. nagios apache unconfined_u:object_r:usr_t:s0 images
    drwxrwxr-x. nagios apache unconfined_u:object_r:usr_t:s0 includes
    -rwxrwxr-x. nagios apache system_u:object_r:usr_t:s0 index.html
    -rwxrwxr-x. nagios apache system_u:object_r:usr_t:s0 index.php

    ...以下略......
    chconを使用して/usr/local/nagios/share/ディレクトリとその下のすべてのファイルセキュリティコンテキストを変更するにはunconfined_u:object_r:httpd_sys_content_t
    [root@nagios ~]# chcon -R unconfined_u:object_r:httpd_sys_content_t:s0 /usr/local/nagios/share/

    クエリの結果:
    [root@nagios ~]# ls -Z /usr/local/nagios/share/
    -rwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 config.inc.php
    drwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 contexthelp
    drwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 docs
    drwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 images
    drwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 includes
    -rwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 index.html
    -rwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 index.php
    drwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 locale
    -rwxrwxr-x. nagios apache unconfined_u:object_r:httpd_sys_content_t:s0 main.html

    httpサービスを再起動する必要がなく、クライアントはすでにアクセスできます.

    5.2 semanageツールを使用して、httpdに非標準ポートをサポートさせる:


    semanageツールは非常に強力で、基本的にすべてのSELinux構成を実現することができますが、多くの場合、SELinuxがどこに間違っているのか分かりません.グラフィックインタフェースの下にグラフィック化された分析ツールがあり、端末インタフェースの下にも非常に強力な分析ツールsealertがありますが、デフォルトでは、この2つのツールはインストールされていません.semanageツールとsealertツールをインストールする必要があります.
    [root@web2 ~]# yum -y install policycoreutils-python setroubleshoot

    注意:semanageの使用は、私のもう一つのブログ:Selinux管理ツールsemanageを参照してください.
    デフォルトではApacheは80、443などいくつかのポートのみをリスニングし、808ポートを直接指定するとservice httpd restartでエラーが発生します.
    [root@web2 ~]# service httpd start
      httpd:(13)Permission denied: make_sock: could not bind to address 0.0.0.0:808
    no listening sockets available, shutting down
    Unable to open logs                                             [ ]
    

    /var/log/messagesファイルを表示すると、次のようなエラーが表示されます.
    [root@web2 ~]# tail /var/log/messages
    Jun 29 10:30:51 web2 setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket . For complete SELinux messages. run sealert -l 2ad073a4-7c64-4175-93ff-9d78f75133af

    ヒントに従って、sealert-l 2 ad 073 a 4-7 c 64-4175-93 ff-9 d 78 f 75133 afを実行し、SELinuxレポートを生成します.
    [root@web2 ~]# sealert -l 2ad073a4-7c64-4175-93ff-9d78f75133af
    # semanage port -a -t PORT_TYPE -p tcp 808

    ここでPORT_TYPEは次のいずれかです:ntop_port_t, http_cache_port_t, http_port_t, puppet_port_t, jboss_messaging_port_t, jboss_management_port_t.
    プロンプトに従ってsemanage port-a-t PORT_を実行します.TYPE-p tcp 808、ここでPORT_TYPEをhttp_に置き換えるport_t
    [root@web2 ~]# semanage port -a -t http_port_t -p tcp 808

    クエリの結果:
    [root@web2 ~]# semanage port -l|grep http
    http_cache_port_t tcp 3128, 8080, 8118, 8123, 10001-10010
    http_cache_port_t udp 3130
    http_port_t tcp 808, 80, 443, 488, 8008, 8009, 8443   ## 808 
    pegasus_http_port_t tcp 5988
    pegasus_https_port_t tcp 5989

    サービスの再起動:
    [root@web2~]#service httpd start httpdを起動中:[OK]

    5.3 selinuxブール値を変更し、プライベートWebサイトの作成を許可


    ユーザが~/www/にファイルを配置することによって自分の個人サイトを作成できるようにするには、Apacheポリシーでその操作を許可する必要がある.次の操作を行います.
    [root@web2 ~]# setsebool httpd_enable_homedirs 1
    

    デフォルトではsetseboolの設定は次の再起動まで保持されます.永続的に有効にするには、次のようなPパラメータを追加する必要があります.
    [root@web2 ~]# setsebool -P httpd_enable_homedirs 1

    setseboolは、ブール値によって制御されるSELinuxポリシーを切り替えるために使用され、現在のブール値ポリシーの状態はgetseboolによって知ることができる.httpdに関連するブール値を表示するには、次の手順に従います.
    [root@web2 ~]# getsebool -a |grep http
    allow_httpd_anon_write --> off
    allow_httpd_mod_auth_ntlm_winbind --> off
    allow_httpd_mod_auth_pam --> off
    allow_httpd_sys_script_anon_write --> off
    httpd_builtin_scripting --> on
    httpd_can_check_spam --> off
    httpd_can_network_connect --> off
    httpd_can_network_connect_cobbler --> off
    httpd_can_network_connect_db --> on
    httpd_can_network_memcache --> off
    httpd_can_network_relay --> off
    httpd_can_sendmail --> off
    httpd_dbus_avahi --> on
    httpd_enable_cgi --> on
    httpd_enable_ftp_server --> off
    httpd_enable_homedirs --> on
    httpd_execmem --> off
    httpd_manage_ipa --> off
    httpd_read_user_content --> off
    httpd_run_stickshift --> off
    httpd_setrlimit --> off
    httpd_ssi_exec --> off
    httpd_tmp_exec --> off
    httpd_tty_comm --> on
    httpd_unified --> on
    httpd_use_cifs --> off
    httpd_use_gpg --> off
    httpd_use_nfs --> on
    httpd_use_openstack --> off
    httpd_verify_dns --> off
    named_bind_http_port --> off

    以上、httpdサービスの一般的なselinux構成を列挙し、他のサービス(vsftpdなど)も同様の方法で処理することができる.
    転載先:SELinuxの一つ:SELinux基本概念及び基本配置|旺旺知識ベース