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-ポリシー違反を表示

Source: https://habr.com/ru/post/J322904/


All Articles