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

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

- 配布-CentOS 7 x64、ユーザー-ルート
- SELinux対応、ターゲットポリシーがロードされました
- 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
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>
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;
#!!! この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";
...
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
[火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]
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〜 ] $ 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]
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]
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日)
リンク: ufile.io/5eced (846 Mb)(リンクの有効期限は2017年3月29日)
パスワード
ルート:ルート
phpbb:phpbb
mysql root:root
mysql phpbb:i6p0AYF1B4Hg
phpbb:phpbb:phpbb1
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-ポリシー違反を表示