wiki:HowTo/SakuraVpsSetup3

Version 23 (modified by 村山 俊之, 7 years ago) ( diff )

--

さくらの VPS セットアップメモ 〜2G プラン据え置き Ubuntu16.04 入れ替え編〜

入れ替え、と言っても一旦別ノード契約しての実質お引越しなのですが…。

国際的には RedHat 系より Debian/Ubuntu の方が主流、と聞いたので、今回は Ubuntu16.04 で建ててみることにします。 個人的には Ubuntu はデスクトップ用途のイメージですが…。

Ubuntu セットアップ

VPS コントロールパネルの「OSインストール」→「カスタムOSインストール」から、「Ubuntu16.04 amd64」を選択し、コンソール画面の内容に従って操作を進めていきました。 ディスクの区画割りで若干カスタマイズを施した以外は概ね画面の指示通りに進めただけです。詳細は省きます。

ソフトウェアの更新

ViM を使うのであればインストールが必要です。

$ sudo su -
# apt install vim

apt コマンドでシステム全体の更新が可能です。 update で更新されるソフトウェアのリストを更新、 upgrade で実際に更新を行います。 apt-get ではなく apt を使うことで、更新によって依存関係が追加されたソフトウェアの追加インストールもやってくれるらしいです。

# apt update
# apt upgrade

Debian/Ubuntu の場合は aptitude もあったほうが良いかもしれません。デフォルトでは入っていないので必要ならインストールします。

# apt install aptitude

ssh 接続のためのセキュリティ設定

CentOS や Scientific などと違って、セットアップが終わった段階でメインで使用するユーザーのアカウントも設定されます。普段使い用のアカウントについては自分でユーザーを作って設定する必要はありません。

sshd の設定については、設定ファイルに施す変更は初回と同様です。公開鍵認証の鍵の設定についても (dsa ではなく rsa2 を使っている以外は) 特に変わりません。 sshd のサービス名は ubuntu では sshd ではなく ssh になっています。再起動は service コマンドではなく /etc/init.d 以下のスクリプトを直接叩いたほうが良いようです (service コマンドではステータスがコンソールに表示されないため)。

# /etc/init.d/ssh restart

visudo は不要です。なお、 sudo で権限昇格できるユーザーのグループは、 ubuntu では wheel グループではなく sudo グループとなっています。

シェルのロケール設定

初回と同じ。

BIND の設定

参考: named を chroot して動かす - いますぐ実践! Linuxシステム管理 / Vol.126

  • デフォルトでは bind9-host はインストールされているものの、 bind9 はインストールされていません。
  • 前回の Scientific Linux 6 のときのような、 chroot 専用の BIND パッケージがあるわけではないようです。

bind9 をインストールします。

# apt install bind9

起動時のオプションに chroot するディレクトリを指定します。

# vim /etc/default/bind9
# startup options for the server
OPTIONS="-u bind -t /var/named/chroot"

chroot 先の環境を構築します。

# 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 がデフォルトで入っているので、設定方法が若干異なるようです。 参考: rsyslogを使ってsftpサーバの操作ログを出力する。 - Qiita

# vim /etc/rsyslog.d/xx-bind.conf
AddUnixListenSocket /var/named/chroot/dev/log

最後に、rsyslogd を再起動し、 bind9 の起動を確認してひとまず完了です。

# /etc/init.d/rsyslog restart
# /etc/init.d/bind9 start
# /etc/init.d/bind9 stop

パケットフィルタリング設定

iptables 自体は導入済み。 設定方法については以下のサイトを参考にした。

  1. iptables コマンドを呼びまくるシェルスクリプトを書いて実行する。
    • IPv4
      $ sudo su -
      # vim iptables.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
      
      # chmod u+x iptables.sh
      # ./iptables.sh
      
    • IPv6
      # vim ip6tables.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
      
      # chmod u+x ip6tables.sh
      # ./ip6tables.sh
      
  2. 設定内容を確認
    # 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
    # 
    
  3. iptables-persistent をインストールし、iptables の設定を保存する
    # apt install iptables-persistent
    
    • ipv4, ipv6 の設定を保存するか尋ねられるので、両方 Yes にしておく
  4. 保存内容を確認
    # 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
    # 
    

設定を変更する場合は、上記のシェルを書き換えて実行した後、以下のコマンドを実行する。

# /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 をインストールする必要がある。

# apt install ntp

設定を変更。

# 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

リスタート。

# /etc/init.d/ntp restart
[ ok ] Restarting ntp (via systemctl): ntp.service.
# 

Web サーバー設定

前回まではここで Postfix の設定をしていましたが、SSL の設定やドメイン移管が終わらなければどうせ動かせないので、今回は後回しにすることにした。 そんなわけで Web サーバーの設定。

Apache のインストールと設定

まずは Apache をインストール。

# apt install apache2

設定ファイルは Red Hat 系以上に分割されまくっていて、設定項目毎にファイルが別々にされてしまっている。

メインの設定ファイルは Ubuntu では以下。

# vim /etc/apache2/apache2.conf

Listen だけは以下のファイルに分離している模様。

# vim /etc/apache2/ports.conf

Server ID 系 (ServerName とか) はポート 80 のデフォルトバーチャルホストに対する設定という扱いで (それ自体はふつう)、以下のファイルに分離している。

# vim /etc/apache2/sites-enabled/000-default.conf

設定方針としてはとりあえず以下の通り。

  • 使用する予定のないモジュールは、 load しない。
  • ServerNamewww.harapeko.jp に。動作確認はクライアント側で hosts を設定しながら行う。
  • ドキュメントルートは /var/www/html のままでいいや。
  • .httpaccess は許容しない。 Wordpress を動かすのに必要な設定は <Location> に対して施す。
  • ディレクトリ 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 の下にあるファイルをチェック。

# cd /etc/apache2/conf-enabled
# vim charset.conf
# コメントアウトを外す
AddDefaultCharset UTF-8

CGI は使う予定ないので conf-enabled/serve-cgi-bin.conf は消してしまう。どうせシンボリックリンクだし欲しくなったらいつでも戻せる。

# rm serve-cgi-bin.conf

次に、 /etc/apache2/mods-enabled 配下をチェック。

# 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 したい場合はセットで使ったほうが良さげだったりするので念の為残した。
# 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 は… 多分要らんやろ…。
# 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

最後に /etc/apache2/sites-* シリーズをチェック。 sites-available の下を見ると sites-enabled には無いものとして default-ssl.conf というのがあるけど、これは後で SSL 証明書のセットアップをするときに設定することにするとして、とりあえず今は後回しにする。

/etc/apache2/000-default.conf を編集。

# cd ../sites-enabled
# vim 000-defailt.conf
<VirtualHost *:80>
        # サーバー名を設定 (コメントアウトを外して修正)
        ServerName www.harapeko.jp

        # Admin メアドは以下で統一
        ServerAdmin root@harapeko.jp
        DocumentRoot /var/www/html

        # ErrorLog, CustomLog はデフォルト設定のまま
</VirtualHost>

その他のヴァーチャルホストについては、以下のようなスクリプトを書いて対応…。

# vim a.pl
#!/usr/bin/perl
for my $site (@ARGV) {
    open my $fh, '>', "$site.conf";
    print $fh <<ENDLINE;
<VirtualHost *:80>
    ServerAdmin root\@harapeko.jp
    DocumentRoot /var/www/vhosts/$site/html
    ServerName $site.harapeko.jp

    IncludeOptional sites-enabled/$site/*.conf
</VirtualHost>
ENDLINE

    mkdir $site, 0755;
}
# chmod u+x a.pl
# ./a.pl blog daiyokujo developer test
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "en_US:",
        LC_ALL = (unset),
        LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
# ls -l
total 36
lrwxrwxrwx 1 root root   35 May 27 06:36 000-default.conf -> ../sites-available/000-default.conf
-rwxr--r-- 1 root root  328 Aug 10 16:00 a.pl
drwxr-xr-x 2 root root 4096 Aug 10 16:00 blog
-rw-r--r-- 1 root root  189 Aug 10 16:00 blog.conf
drwxr-xr-x 2 root root 4096 Aug 10 16:00 daiyokujo
-rw-r--r-- 1 root root  204 Aug 10 16:00 daiyokujo.conf
drwxr-xr-x 2 root root 4096 Aug 10 16:00 developer
-rw-r--r-- 1 root root  204 Aug 10 16:00 developer.conf
drwxr-xr-x 2 root root 4096 Aug 10 16:00 test
-rw-r--r-- 1 root root  189 Aug 10 16:00 test.conf
# 
Note: See TracWiki for help on using the wiki.