今回は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の確認を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 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の確認します。
1 2 |
# getenforce Enforcing |
元気に動いていますね!
ファイアウォール
ファイアウォールに穴をあけましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 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 |
反映させます。
1 |
# service iptables restart |
必要なものはこれだけ
1 |
# yum install httpd wget mysql-server php php-mysql vsftpd |
MySQL
MySQLを起動させます。
1 |
# service mysqld start |
DBの設定を行います。
1 |
# mysql -u root |
1 |
mysql> create database wpdb; |
1 |
mysql> grant all privileges on wpdb.* to wpdbuser@localhost identified by 'foobar'; |
WordPress
WordPressのダウンロードを行います。
1 |
# cd /var/www/ |
1 |
# wget https://ja.wordpress.org/wordpress-4.7.5-ja.zip |
1 |
# unzip wordpress-4.7.5-ja.zip |
1 |
# mv wordpress /var/www/html/wp |
ユーザの追加
ユーザの追加を行います。
1 |
# useradd hoge |
1 |
# passwd hoge |
Apache
権限の変更を行います。
1 |
# chown hoge:apache -R /var/www/html/wp |
Apacheの設定を変更します。
1 2 3 4 5 |
# vi /etc/httpd/conf/httpd.conf #User apache User hoge Group apache |
1 |
# service httpd restart |
ここでアクセスしてみます。
http://IPアドレス/wp
データベース接続情報を入力して、【送信】をクリックしましょう。
エラー発生。
SELinuxにより、『データベースにWEBサービスからアクセス出来ない』ようです。
SELinuxの設定
組み込みルールの有効・無効かのステータスを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# 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関係のルールを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 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にアクセスできるようにします。
1 |
# setsebool -P httpd_can_network_connect_db 1 |
1 |
# setsebool -P httpd_can_network_connect=on |
【送信】をクリックします。
WEBサービスからwp-configに書き込めないよ!というエラーがでています。
semanageを導入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 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の利用
参照権限付与
1 |
# semanage fcontext -a -t httpd_sys_content_t "/var/www/html/wp(/.*)?" |
1 |
# restorecon -R -v /var/www/html/wp |
書き込み権限付与
1 |
# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wp/wp-content(/.*)?" |
1 |
# restorecon -R -v /var/www/html/wp/wp-content |
1 |
# setsebool -P allow_ftpd_full_access 1 |
ファイルの状態を見てみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 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を使っている人であれば、そんなに違和感はないはず。
お疲れ様です。