現在位置: ホーム / みらくるブログ / CentOS7+Apache+Ajax+PHP+PostgreSQLでインタラクティブなページづくり-12 ( 最終回 )

CentOS7+Apache+Ajax+PHP+PostgreSQLでインタラクティブなページづくり-12 ( 最終回 )

このシリーズ最終回の今回は、SELinux の設定をやってみます。 httpd と PostgreSQL の連携で作られたページの... ここを最後まで読むと、SELinux をdisabled にすることなく、とても簡単な方法で、SELinux の恩恵が受けられるようになりますよ。

お久しぶりです。ニックネーム たいちょう です。

前回は、いよいよページが動くよ、という感じだったのですが、具体的話になってしまうので、いったんこのシリーズは終わりにします。Webについては、範囲が絞りにくいので話が散らかってしまいますし。jQueryの話とかできなくてすみませんでした。また、焦点を絞って別にお話ししますので、お楽しみに。

では最後に、Web ページのセキュリティとして、SELinux の設定を効かせてみます。

システム管理者として、SELinux は悩みの種ではなく、信頼できる友達です。枕を高くして眠れる、安全ピンのようなものです。日々明かされる脆弱性の嵐に、必要最小限のフィアーウォールと SELinux だけで立ち向かっていたことがあります。SELinux は、一日何千件もある攻撃をそのポリシに従いはねのけます。それだけではありません、必要な設定をすれば部内からの攻撃も防ぎます。

ここを最後まで読むと、SELinux を disabled にすることなく、とても簡単な方法で、SELinux の恩恵が受けられるようになりますよ。

今日は、ネットワークからサーバーを守る基本の、Type Enforcement の話です。
今や、全世界の開発者のおかげで、ポリシーはモジュール化され、設定や分析も10年前と比較して簡単になっています。
boolean という機能があります。これは便利な機能です。
boolean を on off することで、簡単に設定を切り換えられ、これを、Type Enforcement の tunable policy と呼んでいます。.te ファイルにそのような記述があるのです。
boolean を on にすると、どんなポリシーが有効になるのか知りたいところですが、sesearch コマンドによって、見ることができるようです。今、実験で立てているCentOS 7 にインストールされているか確認します。

$ su -
# sesearch
bash: sesearch: コマンドが見つかりませんでした。

では、dnf でどのパッケージに入っているか見てみます。

# dnf provides sesearch

としても、エラーになってしまいました。

yum を削除していなかったので、yum で試してみました。

# yum provides sesearch

setools-console というパッケージに入っているらしいです。

dnf provides ですが、コマンド名だけでは検索してくれなくて、パスを書く必要があるらしいです。

# dnf provides /*/sesearch

で、setools-console パッケージだよ、と表示されました。

ところで、久しぶりに、CentOS 7の必要なパッケージ(今回は全部)のアップデートを dnf でしようとしたら、dnf がおかしくなっていたみたいです。

# yum update

これで直りました。
dnf に慣れるまでは、yum も使えるようにしておくといいと思いました。
すいません、話が少しずれました。SELinux の話に戻します。

さて、sesearch コマンドは、setools-console ということなので、自分の環境に入っているか調べました。

# rpm -q setools-console

インストールされていませんでした。では、インストールします。

# dnf install setools-console

今日は、Web サーバーが SELinux を有効にしていても、ちゃんと表示されるようにするようにします。

これは、もう結構皆さんよく知っていると思いますし、サーバーを立てた時はかならずやらなければいけないことなので、復習です。

最初に言いましたけど、SELinux には便利な boolean がありますので、この機能を活用します。そして、そのboolean を有効にすることで、どんなポリシーが具体的に有効になったのかを、ある程度理解します。

今、私が有効にした boolean を元に戻して、Web ページを表示させてみます。
今迄作ってきたページは、ユーザ名、パスワードを入れて権限がある人のみが入れるページを見せるのでした。

データベースは、PostgreSQL を使っています。

# semanage boolean --modify --off httpd_can_network_connect_db

オフになったか確認します。

# semanage boolean --list | grep httpd_can_network_connect_db

(オフ , オフ) となっていますね。

ログイン名、admin パスワード、admin に設定してあるので、入れてみます。


エラーになりました。この瞬間に、あ、SELinux が邪魔してる、オフろう、と思うのが今迄だったかもしれませんが、せっかく素晴らしい機能が組み込まれているのに、SELinuxを使わないのはもったいないです。Webの脆弱性から、サーバーが乗っ取られたりすることも防げますしね(ポリシーで決められた範囲で)。

 

この時の、ログを確認します。

# less /var/log/audit/audit.log | grep denied
type=AVC msg=audit(1461403109.104:461): avc:  denied  { name_connect } for  pid=1777 comm="httpd" dest=5432 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:postgresql_port_t:s0 tclass=tcp_socket
type=AVC msg=audit(1461403109.105:462): avc:  denied  { name_connect } for  pid=1777 comm="httpd" dest=5432 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:postgresql_port_t:s0 tclass=tcp_socket

このように、httpd_can_network_connect_db という boolean がオフであると、httpd_t が postgresql_port_t に tcp_socket で name_connect することが許されないため、うまくいかないのです。
では、オンにします。

# semanage boolean --modify --on httpd_can_network_connect_db

オンになったか確認します。

# semanage boolean --list | grep httpd_can_network_connect_db

(オン , オン) となっていますね。
もう一度ページを表示してみます。


ここで、このSELinux の boolean、 httpd_can_network_connect_db は何を許可したのでしょうか。

sesearch で、検索してみます。

# sesearch -b httpd_can_network_connect_db -A -C

 

Found 103 semantic av rules:
ET allow httpd_sys_script_t postgresql_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t postgresql_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t mssql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow mysqld_t netlabel_peer_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t netlabel_peer_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t mssql_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_t postgresql_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t httpd_suexec_t : association sendto ; [ httpd_can_network_connect_db ]
ET allow httpd_t postgresql_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_t postgresql_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t oracle_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t postgresql_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mysqld_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mysqld_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mysqld_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mssql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mssql_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_suexec_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t postgresql_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_suexec_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t postgresql_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_suexec_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t postgresql_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t gds_db_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t postgresql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t postgresql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t httpd_sys_script_t : association sendto ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t netlabel_peer_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t netlabel_peer_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t gds_db_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mysqld_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_php_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_php_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_php_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t mysqld_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t oracle_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mysqld_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t oracle_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow postgresql_t netlabel_peer_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t netlabel_peer_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t gds_db_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t postgresql_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_t oracle_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_t mysqld_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mssql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mssql_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mysqld_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t postgresql_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t postgresql_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t postgresql_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_sys_script_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_sys_script_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_sys_script_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t oracle_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mysqld_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mysqld_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mysqld_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mysqld_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow postgresql_t postgresql_t : association sendto ; [ httpd_can_network_connect_db ]
ET allow httpd_t mysqld_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_t mysqld_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_t mysqld_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t httpd_t : association sendto ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t gds_db_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t postgresql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t netlabel_peer_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t netlabel_peer_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t postgresql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mysqld_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mysqld_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mysqld_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t mysqld_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_suexec_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_suexec_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_suexec_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t netlabel_peer_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_t netlabel_peer_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t mongod_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t oracle_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_suexec_t mysqld_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow mysqld_t mysqld_t : association sendto ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t httpd_php_t : association sendto ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_sys_script_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_sys_script_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow postgresql_t httpd_sys_script_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t oracle_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t postgresql_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t postgresql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_php_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_php_t : association recvfrom ; [ httpd_can_network_connect_db ]
ET allow mysqld_t httpd_php_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mssql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
ET allow httpd_t oracle_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t netlabel_peer_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]
ET allow httpd_php_t netlabel_peer_t : peer recv ; [ httpd_can_network_connect_db ]
ET allow httpd_t postgresql_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t mssql_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ]
ET allow httpd_sys_script_t postgresql_t : tcp_socket recvfrom ; [ httpd_can_network_connect_db ]

下から3行目に、

ET allow httpd_t postgresql_port_t : tcp_socket { recv_msg send_msg name_connect } ; [ httpd_can_network_connect_db ]

というのがありました。
httpd_can_network_connect_db を on にすることにより、httpd_t が postgresql_port_t に tcp_socket で name_connect することが許されたので、結果的にページが表示されたのだと納得できました。

SELinux のセキュリティを私は、力技のセキュリティ、と呼んでいます。
ログにはたくさんの拒否の記録が、ポリシ関連ファイルには多くの許可文が出ますが、ひとつひとつ読んでいくと、自分に必要なアクセスが見えたりして楽しいですよ。

では、合言葉は、 setenforce 1

ちなみに、当社のOSである、Asianux Server 7 は、CentOS と互換ですので、試してみてください。
http://www.miraclelinux.com/product-service/linux-solution/axs7

(参考)
https://wiki.gentoo.org/wiki/SELinux/Booleans
man semanage
man sesearch

OS の技術に興味がある人は、僕と一緒に働きませんか?興味がある人は、ここをクリックしてください!

 

松江ラボ エンジニア募集中

詳細へ暮らしやすさ日本一の水の都、そしてオープンソースの都、
松江で一緒に働くエンジニアを募集しています。
タグ: