[[PageOutline]] = さくらの VPS セットアップメモ 〜2G プラン据え置き Ubuntu16.04 入れ替え編〜 = 入れ替え、と言っても一旦別ノード契約しての実質お引越しなのですが…。 * [wiki:HowTo/SakuraVpsSetup 初回 (1G プラン + CentOS5)] * [wiki:HowTo/SakuraVpsSetup2 2回目 (2G プラン + Scientific Linux 6)] 国際的には RedHat 系より Debian/Ubuntu の方が主流、と聞いたので、今回は Ubuntu16.04 で建ててみることにします。 個人的には Ubuntu はデスクトップ用途のイメージですが…。 == Ubuntu セットアップ == VPS コントロールパネルの「OSインストール」→「カスタムOSインストール」から、「Ubuntu16.04 amd64」を選択し、コンソール画面の内容に従って操作を進めていきました。 ディスクの区画割りで若干カスタマイズを施した以外は概ね画面の指示通りに進めただけです。詳細は省きます。 == ソフトウェアの更新 == ViM を使うのであればインストールが必要です。 {{{ #!console $ sudo su - # apt install vim }}} `apt` コマンドでシステム全体の更新が可能です。 `update` で更新されるソフトウェアのリストを更新、 `upgrade` で実際に更新を行います。 `apt-get` ではなく `apt` を使うことで、更新によって依存関係が追加されたソフトウェアの追加インストールもやってくれるらしいです。 {{{ #!console # apt update # apt upgrade }}} Debian/Ubuntu の場合は `aptitude` もあったほうが良いかもしれません。デフォルトでは入っていないので必要ならインストールします。 {{{ #!console # apt install aptitude }}} == ssh 接続のためのセキュリティ設定 == CentOS や Scientific などと違って、セットアップが終わった段階でメインで使用するユーザーのアカウントも設定されます。普段使い用のアカウントについては自分でユーザーを作って設定する必要はありません。 sshd の設定については、設定ファイルに施す変更は初回と同様です。公開鍵認証の鍵の設定についても (dsa ではなく rsa2 を使っている以外は) 特に変わりません。 sshd のサービス名は ubuntu では `sshd` ではなく `ssh` になっています。再起動は `service` コマンドではなく `/etc/init.d` 以下のスクリプトを直接叩いたほうが良いようです (`service` コマンドではステータスがコンソールに表示されないため)。 {{{ #!console # /etc/init.d/ssh restart }}} `visudo` は不要です。なお、 `sudo` で権限昇格できるユーザーのグループは、 ubuntu では `wheel` グループではなく `sudo` グループとなっています。 == シェルのロケール設定 == 初回と同じ。 == BIND の設定 == 参考: [http://www.usupi.org/sysad/126.html named を chroot して動かす - いますぐ実践! Linuxシステム管理 / Vol.126] * デフォルトでは `bind9-host` はインストールされているものの、 `bind9` はインストールされていません。 * 前回の Scientific Linux 6 のときのような、 chroot 専用の BIND パッケージがあるわけではないようです。 `bind9` をインストールします。 {{{ #!console # apt install bind9 }}} 起動時のオプションに chroot するディレクトリを指定します。 {{{ #!console # vim /etc/default/bind9 }}} {{{ #!sh # startup options for the server OPTIONS="-u bind -t /var/named/chroot" }}} chroot 先の環境を構築します。 {{{ #!console # mkdir -p /var/named/chroot/dev # mkdir -p /var/named/chroot/bind /var/named/chroot/var/run/bind/run /var/named/chroot/var/cache/bind /var/named/chroot/etc # chown root.bind /var/named/chroot/var/run/bind/run # chmod 775 /var/named/chroot/var/run/bind/run # mknod -m 666 /var/named/chroot/dev/random c 1 8 # tar cf - -C /etc bind | tar xvfp - -C /var/named/chroot/etc }}} `dev/log` 経由で syslog にログを渡せるようにします。 Ubuntu 16.04 は rsyslog がデフォルトで入っているので、設定方法が若干異なるようです。 参考: [http://qiita.com/tjinjin/items/f01a62db74dfd6d7db07 rsyslogを使ってsftpサーバの操作ログを出力する。 - Qiita] {{{ #!console # vim /etc/rsyslog.d/xx-bind.conf }}} {{{ AddUnixListenSocket /var/named/chroot/dev/log }}} 最後に、`rsyslogd` を再起動し、 `bind9` の起動を確認してひとまず完了です。 {{{ #!console # /etc/init.d/rsyslog restart # /etc/init.d/bind9 start # /etc/init.d/bind9 stop }}} == パケットフィルタリング設定 == iptables 自体は導入済み。 設定方法については以下のサイトを参考にした。 * [http://hy.xrea.jp/linux/index.php?Ubuntu%2FUbuntu%E3%81%A7iptables%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B Ubuntu/Ubuntuでiptablesを設定する - Welcome to Life with Linux] * [https://calliedesign.com/store/reference/server_setting/build_iptables_firewall_debian_ubuntu/ iptablesによるファイアウォール構築 in Debian/Ubuntu | ホームページ制作会社 キャリーデザイン] * [https://oitibs.com/easy-ubuntu-16-server-firewall/ Easy Ubuntu 16.04 Server Firewall] 1. `iptables` コマンドを呼びまくるシェルスクリプトを書いて実行する。 * IPv4 {{{ #!console $ sudo su - # vim iptables.sh }}} {{{ #!sh #!/bin/sh /sbin/iptables -F /sbin/iptables -X /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -A INPUT -p icmp -j ACCEPT /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A INPUT -m tcp -p tcp -m state --state NEW --dport 53 -j ACCEPT /sbin/iptables -A INPUT -m udp -p udp -m state --state NEW --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT /sbin/iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable /sbin/iptables -A FORWARD -j REJECT --reject-with icmp-port-unreachable # SNMP blocking /sbin/iptables -A OUTPUT -m udp -p udp -m multiport --dports 161,162 -j REJECT --reject-with icmp-port-unreachable }}} {{{ #!console # chmod u+x iptables.sh # ./iptables.sh }}} * IPv6 {{{ #!console # vim ip6tables.sh }}} {{{ #!sh #!/bin/sh /sbin/ip6tables -F /sbin/ip6tables -X /sbin/ip6tables -P INPUT ACCEPT /sbin/ip6tables -P OUTPUT ACCEPT /sbin/ip6tables -P FORWARD ACCEPT /sbin/ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/ip6tables -A INPUT -p icmp -j ACCEPT /sbin/ip6tables -A INPUT -i lo -j ACCEPT /sbin/ip6tables -A INPUT -m tcp -p tcp -m state --state NEW --dport 53 -j ACCEPT /sbin/ip6tables -A INPUT -m udp -p udp -m state --state NEW --dport 53 -j ACCEPT /sbin/ip6tables -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT /sbin/ip6tables -A INPUT -j REJECT --reject-with icmp6-port-unreachable /sbin/ip6tables -A FORWARD -j REJECT --reject-with icmp6-port-unreachable # SNMP blocking /sbin/ip6tables -A OUTPUT -m udp -p udp -m multiport --dports 161,162 -j REJECT --reject-with icmp6-port-unreachable }}} {{{ #!console # chmod u+x ip6tables.sh # ./ip6tables.sh }}} 1. 設定内容を確認 {{{ #!console # iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 state NEW ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 state NEW ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW multiport dports 22,25,587,993,80,443 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT udp -- 0.0.0.0/0 0.0.0.0/0 udp multiport dports 161,162 reject-with icmp-port-unreachable # ip6tables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all ::/0 ::/0 state RELATED,ESTABLISHED ACCEPT icmp ::/0 ::/0 ACCEPT all ::/0 ::/0 ACCEPT tcp ::/0 ::/0 tcp dpt:53 state NEW ACCEPT udp ::/0 ::/0 udp dpt:53 state NEW ACCEPT tcp ::/0 ::/0 state NEW multiport dports 22,25,587,993,80,443 REJECT all ::/0 ::/0 reject-with icmp6-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all ::/0 ::/0 reject-with icmp6-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT udp ::/0 ::/0 udp multiport dports 161,162 reject-with icmp6-port-unreachable # }}} 1. iptables-persistent をインストールし、iptables の設定を保存する {{{ #!console # apt install iptables-persistent }}} * ipv4, ipv6 の設定を保存するか尋ねられるので、両方 Yes にしておく 1. 保存内容を確認 {{{ #!console # cat /etc/iptables/rules.v4 # Generated by iptables-save v1.6.0 on Sat Apr 29 22:29:46 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [36:3368] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-port-unreachable -A FORWARD -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -p udp -m udp -m multiport --dports 161,162 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Sat Apr 29 22:29:46 2017 # cat /etc/iptables/rules.v6 # Generated by ip6tables-save v1.6.0 on Sat Apr 29 22:29:46 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT -A INPUT -p tcp -m state --state NEW -m multiport --dports 22,25,587,993,80,443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp6-port-unreachable -A FORWARD -j REJECT --reject-with icmp6-port-unreachable -A OUTPUT -p udp -m udp -m multiport --dports 161,162 -j REJECT --reject-with icmp6-port-unreachable COMMIT # Completed on Sat Apr 29 22:29:46 2017 # }}} 設定を変更する場合は、上記のシェルを書き換えて実行した後、以下のコマンドを実行する。 {{{ #!console # /etc/init.d/netfilter-persistent save }}} 留意点: * `--reject-with` に渡すオプションは単なるエラーメッセージの種類らしい。 IPv6 では `icmp6-host-prohibited` のようなタイプは存在しなかったので、 IPv4 の方も IPv6 で使えるものと共通の `icmp[6]-port-unreachable` に揃えてみた。 * iptables-persistent については解説されているサイトの多くで `/etc/init.d/iptables-persistent` コマンドとして紹介されているが、 Ubuntu 16.04 では `/etc/init.d/netfilter-persistent` コマンドに改名されていた模様。ちょっとハマった。 == NTP 設定 == ntp をインストールする必要がある。 {{{ #!console # apt install ntp }}} 設定を変更。 {{{ #!sh # vim /etc/ntp.conf # ↓この辺に、使いたい NTP サーバーを追加 # Specify one or more NTP servers. pool ntp.nict.jp iburst server ntp1.sakura.ad.jp # ↓公開しないので、この辺の設定を変更 # By default, exchange time with everybody, but don't allow configuration. #restrict -4 default kod notrap nomodify nopeer noquery limited #restrict -6 default kod notrap nomodify nopeer noquery limited restrict -4 default ignore restrict -6 default ignore }}} リスタート。 {{{ #!console # /etc/init.d/ntp restart [ ok ] Restarting ntp (via systemctl): ntp.service. # }}} == Web サーバー設定 == 前回まではここで Postfix の設定をしていましたが、SSL の設定やドメイン移管が終わらなければどうせ動かせないので、今回は後回しにすることにした。 そんなわけで Web サーバーの設定。 === Apache のインストールと設定 === まずは Apache をインストール。 {{{ #!console # apt install apache2 }}} 設定ファイルは Red Hat 系以上に分割されまくっていて、設定項目毎にファイルが別々にされてしまっている。 メインの設定ファイルは Ubuntu では以下。 {{{ #!console # vim /etc/apache2/apache2.conf }}} `Listen` だけは以下のファイルに分離している模様。 {{{ #!console # vim /etc/apache2/ports.conf }}} Server ID 系 (ServerName とか) はポート 80 のデフォルトバーチャルホストに対する設定という扱いで (それ自体はふつう)、以下のファイルに分離している。 {{{ #!console # vim /etc/apache2/sites-enabled/000-default.conf }}} 設定方針としてはとりあえず以下の通り。 * 使用する予定のないモジュールは、 load しない。 * `ServerName` は `www.harapeko.jp` に。動作確認はクライアント側で hosts を設定しながら行う。 * ドキュメントルートは `/var/www/html` のままでいいや。 * .httpaccess は許容しない。 Wordpress を動かすのに必要な設定は `` に対して施す。 * ディレクトリ index も許容しない。 * 日本語を優先する。デフォルトの文字セットは off にしていたが、 UTF-8 を使用する設定に変更する。 * 従来はアクセスログもエラーログもバーチャルホスト毎に別ファイルで出力していたが、 Ubuntu ではデフォルトの設定を活かして以下の通りに設定する。 * アクセスログは www のみを通常の access.log ファイルに出力し、それ以外のバーチャルホストについては、バーチャルホスト名を含めた形式の内容で 1つのファイル (other_vhosts_access.log) にまとめる (Ubuntu のデフォルト設定を踏襲)。 * エラーログは、当面は Trac を動かしている developer と Wordpress を動かしている blog だけ別ファイルに切り分け、他はすべて混ぜる (他のバーチャルホストでプログラマブルなことをやる場合でエラーログを分けたくなったら適宜設定を追加する)。 そうなると、まず /etc/apache2 直下にある apache2.conf と ports.conf については変更を加える箇所は特に無い。 次に /etc/apache2/conf-enabled の下にあるファイルをチェック。 {{{ #!console # cd /etc/apache2/conf-enabled # vim charset.conf }}} {{{ #!apache # コメントアウトを外す AddDefaultCharset UTF-8 }}} CGI は使う予定ないので conf-enabled/serve-cgi-bin.conf は消してしまう。どうせシンボリックリンクだし欲しくなったらいつでも戻せる。 {{{ #!console # rm serve-cgi-bin.conf }}} 次に、 /etc/apache2/mods-enabled 配下をチェック。 {{{ #!console # cd ../mods-enabled # ls *.load access_compat.load authn_file.load autoindex.load filter.load setenvif.load alias.load authz_core.load deflate.load mime.load status.load auth_basic.load authz_host.load dir.load mpm_event.load authn_core.load authz_user.load env.load negotiation.load }}} 以前のサーバーで使っていないモジュールは削除。 …と言いたいところなんだけど、実際不要だと思えるモジュールがなかなかない。 `mod_status` はステータス画面を見るためのもので通常 localhost からしか見ないものなので必要なとき以外はなしでいいかなという感じなんだけど、例えば `mod_filter` は 2.4 では deflate したい場合はセットで使ったほうが良さげだったりするので念の為残した。 {{{ #!console # rm status.* }}} 逆に `mod_authz_owner` は前回は有効にしてたけど、すぐに必要がどうかはちょっとまだ見極められないので無効のまま。 `mod_mime_magic` も前回は有効にしてたけど、サーバー負荷が重くなるだけだからやめておいたほうが良いみたいな情報もあったりするので同じく無効のまま。 `mod_expires` は前回は有効にしておきながら設定らしい設定をしていなかったのでこれも無効のまま (でも本当はちゃんと設定してあげたほうが良さげ)、`mod_headers` も同様。 `mod_dav` は使うので追加。 `DavLockDB` も使うので `mod_dav_fs` も追加 (.conf ファイルは内容的にもしかしたら要らんかも…)。 `mod_vhost_alias` も追加 (何でこれ無いの? っちゅーくらい Virtual Host 使うなら絶対必須なやつ)。 `mod_rewrite` も一応追加 (!WordPress でパーマネントリンク設定をディレクトリ形式にする場合は必須… !WordPress 捨てたいけどすぐには捨てられないからね 'A`)。 `mod_cgi` は… 多分要らんやろ…。 {{{ #!console # ln -s ../mods-available/dav.load # ln -s ../mods-available/dav_fs.load # ln -s ../mods-available/dav_fs.conf # ln -s ../mods-available/vhost_alias.load # ln -s ../mods-available/rewrite.load }}}