これはシリーズの3番目の記事です。
そして今日、彼女はストリーム「管理」に入りました。 今日は、
モジュールの作成や
RBACの構成は行いませんが、必要最小限の設定を含め、既製のポリシーを使用して、最も抵抗の少ない経路をたどり、通常のLAMPサーバーを単純に強化します。
誰かが忘れてしまった場合、
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
/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-fpmphpbbなどのユーザーを追加します。
[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 -CDTは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 @ lamp www] $ mysql -uroot
エラー2002(HY000):ソケット '/var/lib/mysql/mysql.sock'を介してローカルMySQLサーバーに接続できません(13)ユーザーにデータベースへの接続を許可する方法を見てみましょう。
sesearch -R -A -s user_t -t mysql -C -dDTは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 -dETは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-ポリシー違反を表示