SELinuxでご飯を食べよう WordPress導入編

優

SELinux WordPress

今回は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が搭載されていると思えばよいでしょう。

@see https://thinkit.co.jp/free/article/0706/26/

マルウェア等に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 WordPress

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

 

SELinux WordPress

エラー発生。

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 WordPress

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

 

 

SELinux WordPress

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

 

SELinux WordPress

SELinuxはそんなに怖くないことがわかりますね!

CentOS7でのFirewalldを使っている人であれば、そんなに違和感はないはず。

お疲れ様です。

 

最新情報をチェックしよう!
>システム構築・保守に特化した会社です。

システム構築・保守に特化した会社です。

システムの構築・保守運用「システムガーディアン」 社内システム担当が欲しいが、専属で雇うほどの仕事量はない。 必要な時に必要なだけ頼りたいというお悩みを持つ企業様へ専門知識を持って対応を行っております。 サーバから各種システムまで自社・他社で構築されたシステムに対してサポートを行っております。

CTR IMG