LAMPサーバーの例を使用してSELinux環境をセットアップする

これはシリーズの3番目の記事です。



そして今日、彼女はストリーム「管理」に入りました。 今日は、 モジュールの作成RBACの構成は行いませんが、必要最小限の設定を含め、既製のポリシーを使用して、最も抵抗の少ない経路をたどり、通常のLAMPサーバーを単純に強化します。



誰かが忘れてしまった場合、 L inux、 A pache、 M ysql、 P HPはLAMPの略語の後ろに隠れています。 これは、個人のブログを保存するために購入するすべてのVDSユーザーの大半です。 これがすべてがより安全になることを願っています:)



仮定



したがって、次のことを前提としています。



  1. 配布-CentOS 7 x64、ユーザー-ルート
  2. SELinux対応、ターゲットポリシーがロードされました
  3. SELinuxモード-強制


準備する



LAMPがすでにインストールおよび設定されている場合は、スキップできます

LAMPの標準ソフトウェアパッケージをインストールします。



[root @ lamp〜 ] #yum install -y httpd mariadb-server php-fpm php-mysql



ソフトウェアの最小構成:



/etc/php-fpm.d/www.conf
[www]

listen = 127.0.0.1:9009

ユーザー= Apache

グループ= Apache

pm =動的

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

pm.status_path = / status

request_terminate_timeout = 10s

request_slowlog_timeout = 1s

slowlog = /var/log/php-fpm/www-slow.log

security.limit_extensions = .php

php_admin_value [error_log] = /var/log/php-fpm/www-error.log

php_admin_flag [log_errors] = on

php_admin_value [memory_limit] = 128M

php_value [session.save_handler] =ファイル

php_value [session.save_path] = / var / lib / php / session



/etc/httpd/conf.d/userdir.conf
<IfModule mod_userdir.c>

UserDir有効

UserDir www

</ IfModule>

<ディレクトリ "/ home / * / www">

AllowOverride FileInfo AuthConfig制限インデックス

オプションMultiViewsインデックス

メソッドGET POST OPTIONSが必要

DirectoryIndex index.html index.htm index.php

<FilesMatch "\ .php $">

<「-f%{REQUEST_FILENAME}」の場合>

SetHandler "proxy:fcgi://127.0.0.1:9009"

</ If>

</ FilesMatch>

</ Directory>



必要なすべてのサービスを実行します。



[root @ lamp〜 ] #systemctl enable httpd mariadb php-fpm

[root @ lamp〜 ] #systemctl start httpd mariadb php-fpm



phpbbなどのユーザーを追加します。



[root @ lamp〜 ] #useradd -Z user_u -m -g apache phpbb

[ルート@ランプ〜] #chmod 750 / home / phpbb



そして、phpinfo()を使用して簡単なテストファイルを作成します。



[phpbb @ lamp〜] $ mkdir www

[phpbb @ lamp〜 ] $ echo "<?php phpinfo();?>"> www / info.php



リンクをたどる...





...そして、誰もが正確に得るものを取得します:)



エラーに対処します



次のステップが「SELinuxの無効化」である他のマニュアルとは異なり、今度はそれが起こった理由と何ができるかを調べます。



まず、SELinuxポリシーを管理するためのコンソールユーティリティをインストールします。



[root @ lamp〜 ] #yum install -y policycoreutils-python policycoreutils-newrole policycoreutils-restorecond setools-console



そして、必要なモジュールを有効にします( semoduleコマンドを使用):



[root @ lamp〜 ] #semodule -e apache

[root @ lamp〜 ] #semodule -e mysql



このページを開くときにApacheがどのような問題に遭遇したかを正確に見てみましょう。



audit2allow -lb -t httpd_t
#============== httpd_t ===============

#!!! このavcは、次のブール値のいずれかを使用して許可できます。

#httpd_enable_homedirs、httpd_read_user_content、httpd_unified

httpd_tを許可httpd_user_content_t:ファイルgetattr;



そのとおりです。ユーザーのホームディレクトリ内のwwwフォルダー(およびwebフォルダーとpublic_htmlフォルダー)は、規則に示されているタイプhttpd_user_content_tを自動的に取得します。



sesearch -T -s user_t -c dir -d
...

type_transition user_t user_home_dir_t:dir httpd_user_content_t "public_html";

type_transition user_t user_home_dir_t:dir httpd_user_content_t "www";

type_transition user_t user_home_dir_t:dir httpd_user_content_t "web";

...



治療法はaudit2allowの出力で示され、変数の設定はsetsebool (またはsemanage booleanコマンドで行われます。



[root @ lamp httpd] #setsebool -P httpd_read_user_content = 1



ページを更新して、以下を取得します。





ログを確認します。



/ var / log / httpd / error_log
[火2月28日21:15:04.555595 2017] [プロキシ:エラー] [pid 21586](13)アクセス許可が拒否されました:AH00957:FCGI:127.0.0.1:9009への接続の試行(*)が失敗しました

[火2月28日21:15:04.555892 2017] [proxy_fcgi:エラー] [pid 21586] [クライアント192.168.56.101rec7974] AH01079:バックエンドへの接続に失敗しました:127.0.0.1



すべてが明確です。httpdはどこにも接続できず、httpdは必要な場所にしか接続できません。 これは論理的です。Webサーバーが突然sshを介して接続すると、明らかに奇妙なことが起こります。

Webサーバーがどこに行くことができるか見てみましょうか?



sesearch -A -s httpd_t -c tcp_socket -p name_connect -d -C
DTはhttpd_t port_typeを許可します:tcp_socket name_connect; [httpd_can_network_connect]

DTはhttpd_t mythtv_port_tを許可します:tcp_socket name_connect; [httpd_can_connect_mythtv]

DTはhttpd_tを許可しますzabbix_port_t:tcp_socket name_connect; [httpd_can_connect_zabbix]

DTはhttpd_t smtp_port_tを許可します:tcp_socket name_connect; [httpd_can_sendmail]

DTはhttpd_t mssql_port_tを許可します:tcp_socket name_connect; [httpd_can_network_connect_db]

DTはhttpd_t postgresql_port_tを許可します:tcp_socket name_connect; [httpd_can_network_connect_db]

ETはhttpd_t ocsp_port_tを許可します:tcp_socket name_connect; [kerberos_enabled]

DTはhttpd_t oracle_port_tを許可します:tcp_socket name_connect; [httpd_can_network_connect_db]

DTはhttpd_t gopher_port_tを許可します:tcp_socket name_connect; [httpd_can_network_relay]

DTはhttpd_tを許可しますosapi_compute_port_t:tcp_socket name_connect; [httpd_use_openstack]

DTはhttpd_t mongod_port_tを許可します:tcp_socket name_connect; [httpd_can_network_connect_db]

DTはhttpd_t memcache_port_tを許可します:tcp_socket name_connect; [httpd_can_network_relay]

DTはhttpd_t memcache_port_tを許可します:tcp_socket name_connect; [httpd_can_network_memcache]

DTはhttpd_t http_cache_port_tを許可します:tcp_socket name_connect; [httpd_can_network_relay]

DTはhttpd_t cobbler_port_tを許可します:tcp_socket name_connect; [httpd_can_network_connect_cobbler]

DTはhttpd_t ftp_port_tを許可します:tcp_socket name_connect; [httpd_can_connect_ftp]

DTはhttpd_t ftp_port_tを許可します:tcp_socket name_connect; [httpd_can_network_relay]

DTはhttpd_t gds_db_port_tを許可します:tcp_socket name_connect; [httpd_can_network_connect_db]

DTはhttpd_t pop_port_tを許可します:tcp_socket name_connect; [httpd_can_sendmail]

DTはhttpd_t http_port_tを許可します:tcp_socket name_connect; [httpd_can_network_relay]

ETはhttpd_t http_port_tを許可します:tcp_socket name_connect; [httpd_graceful_shutdown]

ETはhttpd_tを許可しますkerberos_port_t:tcp_socket name_connect; [kerberos_enabled]

DTはhttpd_t ldap_port_tを許可します:tcp_socket name_connect; [httpd_can_connect_ldap]

DTはhttpd_t ephemeral_port_typeを許可します:tcp_socket name_connect; [httpd_use_openstack]

DTはhttpd_t ephemeral_port_typeを許可します:tcp_socket name_connect; [httpd_can_connect_ftp]

DTはhttpd_t ephemeral_port_typeを許可します:tcp_socket name_connect; [httpd_can_network_relay]

DTはhttpd_tを許可squid_port_t:tcp_socket name_connect; [httpd_can_network_relay]

DTはhttpd_tを許可しますmysqld_port_t:tcp_socket name_connect; [httpd_can_network_connect_db]



角括弧は、このルールの操作を担当する変数を示します。

合計:接続が許可されるタイプの1つにポート9009を追加し、 httpd_can_network_relay変数を1に設定する必要があります。



新しいポートは、 semanage portコマンドを使用して追加されます



[root @ lamp httpd] #semanage port -a -t http_cache_port_t -p tcp 9009

[root @ lamp httpd] #setsebool -P httpd_can_network_relay = 1



ページを更新すると、以下が表示されます。







もっと複雑なもの



タスクを複雑にして、このホストにphpbbを配置しましょう。



phpBB 3.2.0をインストールします
[phpbb @ lamp〜 ] $ curl www.phpbb.com/files/release/phpBB-3.2.0.zip -O

[phpbb @ lamp〜 ] $ phpBB-3.2.0.zipを解凍します

[phpbb @ lamp〜] $ mv phpBB3 / * www /

[phpbb @ lamp〜] $ restorecon -R www /



自分用のベースを作成してみましょう。



[phpbb @ lamp www] $ mysql -uroot

エラー2002(HY000):ソケット '/var/lib/mysql/mysql.sock'を介してローカルMySQLサーバーに接続できません(13)



ユーザーにデータベースへの接続を許可する方法を見てみましょう。



sesearch -R -A -s user_t -t mysql -C -d
DTはuser_tを許可しますmysqld_var_run_t:dir {getattr search open}; [selinuxuser_mysql_connect_enabled]

DT allow user_t mysqld_db_t:dir {getattr search open}; [selinuxuser_mysql_connect_enabled]

DTはuser_tを許可しますmysqld_t:unix_stream_socket connectto; [selinuxuser_mysql_connect_enabled]

DTはuser_tを許可しますmysqld_t:unix_stream_socket connectto; [selinuxuser_mysql_connect_enabled]

DTはuser_tを許可しますmysqld_var_run_t:sock_file {write getattr append open}; [selinuxuser_mysql_connect_enabled]

DTはuser_tを許可しますmysqld_var_run_t:sock_file {write getattr append open}; [selinuxuser_mysql_connect_enabled]



OK、 selinuxuser_mysql_connect_enabledをオンにして続行します。



[root @ lamp httpd] #setsebool -P selinuxuser_mysql_connect_enabled = 1



データベースを作成し、phpbbのインストールを試みます。







なぜそう httpdはユーザーデータを変更できないためです。 彼が何を変えることができるかを調べましょうか?



sesearch -A -s httpd_t -p write -t​​ user -C -R -d
ETはhttpd_tを許可しますhttpd_user_rw_content_t:ファイル{ioctl読み取り書き込み作成getattr setattrロック追加リンク解除リンク名前変更オープン}; [httpd_builtin_scripting]

ETはhttpd_tを許可しますhttpd_user_ra_content_t:dir {ioctl write getattr lock add_name search open}; [httpd_builtin_scripting]

ETはhttpd_tを許可しますhttpd_user_ra_content_t:dir {ioctl write getattr lock add_name search open}; [httpd_builtin_scripting]

ETはhttpd_t httpd_user_rw_content_tを許可します:dir {ioctl読み取り書き込みgetattrロックadd_name remove_name検索open}; [httpd_builtin_scripting]

ETはhttpd_t httpd_user_rw_content_tを許可します:dir {ioctl読み取り書き込みgetattrロックadd_name remove_name検索open}; [httpd_builtin_scripting]

ET httpd_t httpd_user_rw_content_tを許可:dir {ioctl読み取り書き込み作成getattr setattrロックアンリンクリンク名前変更add_name remove_name親検索rmdir open}; [httpd_builtin_scripting]

ETはhttpd_t httpd_user_rw_content_tを許可します:dir {ioctl読み取り書き込みgetattrロックadd_name remove_name検索open}; [httpd_builtin_scripting]

DTはhttpd_t user_tty_device_tを許可します:chr_file {ioctl read write getattr lock append}; [httpd_tty_comm]

ETはhttpd_tを許可しますhttpd_user_rw_content_t:sock_file {read write getattr append open}; [httpd_builtin_scripting]

DTはhttpd_tを許可しますuser_devpts_t:chr_file {ioctl読み取り書き込みgetattrロック追加}; [httpd_tty_comm]

ETはhttpd_t httpd_user_rw_content_tを許可します:lnk_file {ioctl read write create getattr setattr lock append unlink link rename}; [httpd_builtin_scripting]



php-xmlをインストールし、 httpd_builtin_scripting有効にして、指定されたファイルとフォルダーにコンテキストhttpd_user_rw_content_tを割り当てます( chconコマンドを使用 ):



[root @ lamp httpd] #setsebool -P httpd_builtin_scripting = 1

[phpbb @ lamp www] $ chmod 660 config.php

[phpbb @ lamp www] $ chcon -t httpd_user_rw_content_t cache / store / files / config.php images / avatars / upload /



取得するもの:







phpBBをさらにインストールし、インストールを削除して、機能するフォーラムを取得します。







構成コンテキストを元に戻します。



[phpbb @ lamp www] $ chcon -t httpd_user_content_t config.php

安全なフォーラムをお楽しみください:)



あとがきの代わりに



1行のコードを記述することなく、マンファイルと標準のSELinuxデフォルトポリシーの知識のみを使用して、30分で標準サービスの安全な環境を構成できます。 これはLAMPだけではありません。標準ポリシーには403個の既製モジュールが含まれています。 これは、管理者が直面するほとんどのタスクを解決するのに十分です。 SELinuxをオフにしたり、 ダンを泣かせたりしないください



ボーナス#1
それをすべて読んだ人のために-記事から既製の画像。



リンク: ufile.io/5eced (846 Mb)(リンクの有効期限は2017年3月29日)



パスワード
ルート:ルート

phpbb:phpbb

mysql root:root

mysql phpbb:i6p0AYF1B4Hg

phpbb:phpbb:phpbb1



ボーナス#2
小さなチートシート。



チーム



  • semodule-モジュールのリストを管理します
  • sestatus-SELinuxの現在のステータス
  • setenforce 1/0-強制の有効化/無効化
  • audit2allow-ルールを生成する(およびヒント用の)ユーティリティ
  • sesearch-ポリシー内のルールを見つけるためのユーティリティ
  • seinfo-タイプ、ロール、属性などに関する情報を表示します
  • semanage-ポリシーを変更できます
  • chcon-FSのコンテキストを変更できます
  • restorecon-デフォルトのコンテキストを復元します
  • setsebool-変数をオン/オフに設定します。 C -P-ディスクへの書き込み
  • getsebool-変数を取得します。 -a-すべて表示


ポリシーの変更



  • semanage port -a / -d -t httpd_port_t -p tcp 8044-ポート番号をコンテキストに追加/削除
  • semanage fcontext -a / -d -t httpd_cache_t "/srv/http/cache(/.*)?" -このマスクのコンテキストの追加/削除
  • semanage permissive -a / -d httpd_t-httpd_tのpermissiveモードを有効/無効にします


チームの議論



  • id -Z-現在のユーザーのコンテキストを表示します
  • ls -Z-ファイルのコンテキストを表示
  • ps -Z-プロセスのコンテキストを表示します
  • netstat -Z-接続コンテキストを表示
  • usermod / useradd -ZユーザーをSELinuxユーザーに関連付けます
  • ausearch -m AVC-ポリシー違反を表示





All Articles