
今回はSELinuxご紹介。
SELinuxって何もの?
SELinux
アメリカ国家安全保障局 (NSA) がGPL下で提供しているLinuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールの名称。名前から勘違いされることが多いが、Linuxディストリビューションの1つではない。1992年、NSAが主体となってFlukeというOS上におけるMAC機能の研究のために開発された。MAC機能はセキュリティの高いOSの提供を可能にするが、主にMulti Level Securityと呼ばれる機能で提供されている。この機能ではアクセスする対象(サブジェクト)全てに階層化された権限が与えられ、またアクセスされる対象(オブジェクト)にも全て階層化された情報の重要度に応じたラベルを付加することによってアクセスの制御を行うもので、柔軟に実装するには複雑なシステムになってしまうという欠点があった。
@see Wikipedia
小難しい単語が並んでますが、ファイアウォールみたいなものと思って貰えればオーケー!
SELinuxによって強化される機能とは?
通常のLinuxに実装されている任意アクセス制御(DAC)と呼ばれるアクセス制御方式に問題があることが指摘されているからです。任意アクセス制御方式は基本的にファイルの所有者にすべてのアクセス権限の設定を委ねています。つまり、とても重要な情報であったとしても勝手にファイルの所有者がアクセス権を変更できてしまうのです。
さらに、システム管理者権限を保有するrootユーザに対して、すべての情報へ自由にアクセスが許可されている、とても大きな特権が与えられています。このため、不正アクセスやほとんどのマルウェアはrootユーザの強大な権限を奪取することを前提として動作しています。もし一度でもroot権限を悪用されてしまうとすべての情報が漏洩することを覚悟しなければなりません。
そこでSELinuxでは、rootユーザの動作を制御できるアクセス制御方式(強制アクセス制御:MAC)やrootユーザの特権を細かく分割する機能(最少特権:LeastPrivilege)を実装しています。実際にroot権限が奪取された場合でも、SELinuxが有効になっていれば、被害を事前に防げる例が多く報告されているのです。
つまり、Linuxに強制アクセス制御機能や最少特権の仕組みを実装するためにSELinuxが搭載されていると思えばよいでしょう。
マルウェア等にroot権限が取られても、SELinuxで特権を予め制限しておくことで、影響箇所を最小限に留めることが出来ます。
LinuxだけではセキュアOSを実現出来ないので、セキュリティの高い基準を満たす為に組み込まれたものなのですね!
あんまりモテないやつ
障害でのトラブルシューティングで切り分けが複雑になり易いとか、SELinuxをそもそも有効化して構築しない系譜が多いことで、一度も有効化してサーバを建てたことがないエンジニアもいるように思えます。
デフォルトで有効化されているのに、多くのサーバで無効化される不遇な存在。失恋続きの私にはなにやら親近感がわきます。
SELinuxにまつわる伝説
SELinuxを極めたエンジニアはご飯を食べていける
そのような話があります。
本当にSELinuxで人は飯を食べていけるのか?
幸せになれるのか。
愛を証明しようと思う。
SELinuxを有効にしたWordPressの導入方法をご紹介することで、皆が飢えずにご飯を食べていけたらいいなと願っています。そうすれば戦争だってなくなるかもしれない。
色々思惑はありますが、セキュリティが高い高信頼性サーバが増えることは良いことです。
WEBサーバ環境インストールのCentOSから
サーバIPの確認を行います。
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:49:C7:27
inet addr:192.168.11.20 Bcast:192.168.11.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe49:c727/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7141 errors:0 dropped:0 overruns:0 frame:0
TX packets:51 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:568794 (555.4 KiB) TX bytes:9395 (9.1 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
SELinuxの確認します。
# getenforce Enforcing
元気に動いていますね!
ファイアウォール
ファイアウォールに穴をあけましょう。
# vi /etc/sysconfig/iptables # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
反映させます。
# service iptables restart
必要なものはこれだけ
# yum install httpd wget mysql-server php php-mysql vsftpd
MySQL
MySQLを起動させます。
# service mysqld start
DBの設定を行います。
# mysql -u root
mysql> create database wpdb;
mysql> grant all privileges on wpdb.* to wpdbuser@localhost identified by 'foobar';
WordPress
WordPressのダウンロードを行います。
# cd /var/www/
# wget https://ja.wordpress.org/wordpress-4.7.5-ja.zip
# unzip wordpress-4.7.5-ja.zip
# mv wordpress /var/www/html/wp
ユーザの追加
ユーザの追加を行います。
# useradd hoge
# passwd hoge
Apache
権限の変更を行います。
# chown hoge:apache -R /var/www/html/wp
Apacheの設定を変更します。
# vi /etc/httpd/conf/httpd.conf #User apache User hoge Group apache
# service httpd restart
ここでアクセスしてみます。
http://IPアドレス/wp

データベース接続情報を入力して、【送信】をクリックしましょう。

エラー発生。
SELinuxにより、『データベースにWEBサービスからアクセス出来ない』ようです。
SELinuxの設定
組み込みルールの有効・無効かのステータスを確認します。
# getsebool -a abrt_anon_write --> off abrt_handle_event --> off allow_console_login --> on allow_cvs_read_shadow --> off allow_daemons_dump_core --> on allow_daemons_use_tcp_wrapper --> off allow_daemons_use_tty --> on allow_domain_fd_use --> on allow_execheap --> off allow_execmem --> on allow_execmod --> on allow_execstack --> on allow_ftpd_anon_write --> off allow_ftpd_full_access --> on allow_ftpd_use_cifs --> off allow_ftpd_use_nfs --> off allow_gssd_read_tmp --> on allow_guest_exec_content --> off allow_httpd_anon_write --> off allow_httpd_mod_auth_ntlm_winbind --> off allow_httpd_mod_auth_pam --> off allow_httpd_sys_script_anon_write --> off allow_java_execstack --> off allow_kerberos --> on allow_mount_anyfile --> on allow_mplayer_execstack --> off allow_nsplugin_execmem --> on allow_polyinstantiation --> off allow_postfix_local_write_mail_spool --> on allow_ptrace --> off allow_rsync_anon_write --> off allow_saslauthd_read_shadow --> off allow_smbd_anon_write --> off allow_ssh_keysign --> off allow_staff_exec_content --> on allow_sysadm_exec_content --> on allow_unconfined_nsplugin_transition --> off allow_user_exec_content --> on allow_user_mysql_connect --> off allow_user_postgresql_connect --> off allow_write_xshm --> off allow_xguest_exec_content --> off allow_xserver_execmem --> off allow_ypbind --> off allow_zebra_write_config --> on antivirus_can_scan_system --> off antivirus_use_jit --> off authlogin_radius --> off awstats_purge_apache_log_files --> off cdrecord_read_content --> off cluster_can_network_connect --> off cluster_manage_all_files --> on cluster_use_execmem --> off cobbler_anon_write --> off cobbler_can_network_connect --> off cobbler_use_cifs --> off cobbler_use_nfs --> off condor_domain_can_network_connect --> off cron_can_relabel --> off daemons_enable_cluster_mode --> on dhcpc_exec_iptables --> off domain_kernel_load_modules --> off exim_can_connect_db --> off exim_manage_user_files --> off exim_read_user_files --> off fcron_crond --> off fenced_can_network_connect --> off fenced_can_ssh --> off fips_mode --> on ftp_home_dir --> off ftpd_connect_db --> off ftpd_use_fusefs --> off ftpd_use_passive_mode --> off git_cgi_enable_homedirs --> off git_cgi_use_cifs --> off git_cgi_use_nfs --> off git_session_bind_all_unreserved_ports --> off git_session_users --> off git_system_enable_homedirs --> off git_system_use_cifs --> off git_system_use_nfs --> off global_ssp --> off gluster_anon_write --> off gluster_export_all_ro --> off gluster_export_all_rw --> on gpg_agent_env_file --> off gpg_web_anon_write --> off httpd_builtin_scripting --> on httpd_can_check_spam --> off httpd_can_network_connect --> on httpd_can_network_connect_cobbler --> off httpd_can_network_connect_db --> on httpd_can_network_memcache --> off httpd_can_network_relay --> off httpd_can_sendmail --> off httpd_dbus_avahi --> on httpd_enable_cgi --> on httpd_enable_ftp_server --> off httpd_enable_homedirs --> off httpd_execmem --> off httpd_manage_ipa --> off httpd_read_user_content --> off httpd_run_stickshift --> off httpd_serve_cobbler_files --> off httpd_setrlimit --> off httpd_ssi_exec --> off httpd_tmp_exec --> off httpd_tty_comm --> on httpd_unified --> on httpd_use_cifs --> off httpd_use_fusefs --> off httpd_use_gpg --> off httpd_use_nfs --> off httpd_use_openstack --> off httpd_verify_dns --> off icecast_connect_any --> off init_upstart --> on irssi_use_full_network --> off kdumpgui_run_bootloader --> off logging_syslog_can_read_tmp --> off logging_syslogd_can_sendmail --> off mmap_low_allowed --> off mozilla_read_content --> off mysql_connect_any --> off named_bind_http_port --> off named_write_master_zones --> off ncftool_read_user_content --> off nscd_use_shm --> on nsplugin_can_network --> on openvpn_enable_homedirs --> on openvpn_run_unconfined --> off piranha_lvs_can_network_connect --> off postgresql_can_rsync --> off pppd_can_insmod --> off pppd_for_user --> off privoxy_connect_any --> on puppet_manage_all_files --> off puppetmaster_use_db --> off qemu_full_network --> on qemu_use_cifs --> on qemu_use_comm --> off qemu_use_nfs --> on qemu_use_usb --> on racoon_read_shadow --> off rsync_client --> off rsync_export_all_ro --> off rsync_use_cifs --> off rsync_use_nfs --> off samba_create_home_dirs --> off samba_domain_controller --> off samba_enable_home_dirs --> off samba_export_all_ro --> off samba_export_all_rw --> off samba_portmapper --> off samba_run_unconfined --> off samba_share_fusefs --> off samba_share_nfs --> off sanlock_use_fusefs --> off sanlock_use_nfs --> off sanlock_use_samba --> off secure_mode --> off secure_mode_insmod --> off secure_mode_policyload --> off sepgsql_enable_users_ddl --> on sepgsql_unconfined_dbadm --> on sge_domain_can_network_connect --> off sge_use_nfs --> off smartmon_3ware --> off spamassassin_can_network --> off spamd_enable_home_dirs --> on squid_connect_any --> on squid_use_tproxy --> off ssh_chroot_full_access --> off ssh_chroot_manage_apache_content --> off ssh_chroot_rw_homedirs --> off ssh_sysadm_login --> off telepathy_tcp_connect_generic_network_ports --> off tftp_anon_write --> off tftp_use_cifs --> off tftp_use_nfs --> off tor_bind_all_unreserved_ports --> off unconfined_login --> on unconfined_mmap_zero_ignore --> off unconfined_mozilla_plugin_transition --> off use_fusefs_home_dirs --> off use_lpd_server --> off use_nfs_home_dirs --> on use_samba_home_dirs --> off user_direct_dri --> on user_direct_mouse --> off user_ping --> on user_rw_noexattrfile --> on user_setrlimit --> on user_tcp_server --> off user_ttyfile_stat --> off varnishd_connect_any --> off vbetool_mmap_zero_ignore --> off virt_use_comm --> off virt_use_execmem --> off virt_use_fusefs --> off virt_use_nfs --> off virt_use_samba --> off virt_use_sanlock --> off virt_use_sysfs --> on virt_use_usb --> on virt_use_xserver --> off webadm_manage_user_files --> off webadm_read_user_files --> off wine_mmap_zero_ignore --> off xdm_exec_bootloader --> off xdm_sysadm_login --> off xen_use_nfs --> off xguest_connect_network --> on xguest_mount_media --> on xguest_use_bluetooth --> on xserver_object_manager --> off zabbix_can_network --> off
http関係のルールを確認します。
# getsebool -a | grep http allow_httpd_anon_write --> off allow_httpd_mod_auth_ntlm_winbind --> off allow_httpd_mod_auth_pam --> off allow_httpd_sys_script_anon_write --> off httpd_builtin_scripting --> on httpd_can_check_spam --> off httpd_can_network_connect --> off httpd_can_network_connect_cobbler --> off httpd_can_network_connect_db --> off httpd_can_network_memcache --> off httpd_can_network_relay --> off httpd_can_sendmail --> off httpd_dbus_avahi --> on httpd_enable_cgi --> on httpd_enable_ftp_server --> off httpd_enable_homedirs --> off httpd_execmem --> off httpd_manage_ipa --> off httpd_read_user_content --> off httpd_run_stickshift --> off httpd_serve_cobbler_files --> off httpd_setrlimit --> off httpd_ssi_exec --> off httpd_tmp_exec --> off httpd_tty_comm --> on httpd_unified --> on httpd_use_cifs --> off httpd_use_fusefs --> off httpd_use_gpg --> off httpd_use_nfs --> off httpd_use_openstack --> off httpd_verify_dns --> off named_bind_http_port --> off
WEBサービス経由でDBにアクセスできるようにします。
# setsebool -P httpd_can_network_connect_db 1
# setsebool -P httpd_can_network_connect=on

【送信】をクリックします。

WEBサービスからwp-configに書き込めないよ!というエラーがでています。
semanageを導入します。
# yum provides */semanage
base/filelists_db | 6.4 MB 00:12
extras/filelists_db | 25 kB 00:00
updates/filelists_db | 719 kB 00:01
libsemanage-devel-2.0.43-5.1.el6.x86_64 : Header files and libraries used to
: build policy manipulation tools
Repo : base
Matched from:
Filename : /usr/include/semanage
libsemanage-devel-2.0.43-5.1.el6.i686 : Header files and libraries used to build
: policy manipulation tools
Repo : base
Matched from:
Filename : /usr/include/semanage
policycoreutils-python-2.0.83-30.1.el6_8.x86_64 : SELinux policy core python
: utilities
Repo : base
Matched from:
Filename : /usr/sbin/semanage
# yum install policycoreutils-python Installed: policycoreutils-python.x86_64 0:2.0.83-30.1.el6_8 Dependency Installed: audit-libs-python.x86_64 0:2.4.5-6.el6 libcgroup.x86_64 0:0.40.rc1-23.el6 libselinux-python.x86_64 0:2.0.94-7.el6 libsemanage-python.x86_64 0:2.0.43-5.1.el6 setools-libs.x86_64 0:3.3.7-4.el6 setools-libs-python.x86_64 0:3.3.7-4.el6 Dependency Updated: audit.x86_64 0:2.4.5-6.el6 audit-libs.x86_64 0:2.4.5-6.el6 libselinux.x86_64 0:2.0.94-7.el6 libselinux-utils.x86_64 0:2.0.94-7.el6 libsemanage.x86_64 0:2.0.43-5.1.el6 policycoreutils.x86_64 0:2.0.83-30.1.el6_8 Complete!
semanageの利用
参照権限付与
# semanage fcontext -a -t httpd_sys_content_t "/var/www/html/wp(/.*)?"
# restorecon -R -v /var/www/html/wp
書き込み権限付与
# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wp/wp-content(/.*)?"
# restorecon -R -v /var/www/html/wp/wp-content
# setsebool -P allow_ftpd_full_access 1
ファイルの状態を見てみる
# ls -lhaZ drwxr-xr-x. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 . drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .. -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 .htaccess -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 index.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 license.txt -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 readme.html -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-activate.php drwxr-xr-x. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-admin -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-blog-header.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-comments-post.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-config-sample.php -rw-rw-rw-. hoge apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 wp-config.php drwxr-xr-x. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-content -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-cron.php drwxr-xr-x. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-includes -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-links-opml.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-load.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-login.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-mail.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-settings.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-signup.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 wp-trackback.php -rw-r--r--. hoge apache unconfined_u:object_r:httpd_sys_content_t:s0 xmlrpc.php

ここまできましたね!

淡々と入力していきましょ~!

ログインを押すと管理画面へのログインページにリダイレクトされます。

SELinuxはそんなに怖くないことがわかりますね!
CentOS7でのFirewalldを使っている人であれば、そんなに違和感はないはず。
お疲れ様です。
