この広告は、90日以上更新していないブログに表示しています。

爆速でセットアップを完了するため、極力コピペで設定できるようにしてみたよ(・∀・)
動作検証は、さくらのVPSで標準OSをインストールして行った。記事執筆時点ではCentOS6.6がインストールされたぞ。
# cat /etc/issueCentOS release 6.6 (Final)# uname -rsLinux 2.6.32-504.3.3.el6.x86_64
本記事の内容をFabric化したスクリプトを公開!ぜひ試してみてね。
→超速でCentOS6.6(さくらのVPS)をセットアップする俺史上最強のFabricスクリプトをさらす
まずは、コンソールからSSHで接続しよう。
[localhost ~]$ ssh root@XX.XX.XX.XX
なお、サーバを起動してない場合は、事前に管理画面からサーバを起動しよう。詳しい方法はさくらのヘルプページを参考に。
さくらのVPSの場合、rootのパスワードはメールに直書きされて送られてくるので、最初に変更しておこう。
# passwd
rootで直接作業をするとリスクが高いので、作業用のユーザを作成し、普段の作業はそちらで行うようにしよう。
後ほど、su/sudo権限をwheelグループに付与するので、ここで作成するユーザはwheelグループに所属させる。
# useradd <user_name> -G wheel# passwd <user_name>
<user_name> の部分は、作成するユーザ名に置き換えてほしい。
これから色々な設定ファイルを弄るので、いつでも元に戻せるように、etckeeper を入れておこう。
etckeeperはデフォルトで、/etcディレクトリ配下をgitでバージョン管理してくれるぞ。
# yum -y install etckeeper
ほっとくと、etckeeperは/etc/shadowや/etc/passwdも管理対象にしてしまう。これらは対象外にしておこう。
# touch /etc/.gitignore# echo "shadow*" >> /etc/.gitignore# echo "gshadow*" >> /etc/.gitignore# echo "passwd*" >> /etc/.gitignore# echo "group*" >> /etc/.gitignore
では、初期状態を保存しておこう。
# etckeeper init# etckeeper commit "First Commit"
etckeeperはyumなどのパッケージ管理のコマンドを実行した時や、cronで一日一回自動でコミットしてくれる。
ちなみに、etckeeper自体は単なるVCSのラッパーなので、/etcディレクトリで普通にgitコマンドが使えることを覚えておこう。
ファイルを前の状態に戻したりするときは、直接gitコマンドで操作したほうが簡単だ。
/etc/pam.d/su を修正するためのコマンドを叩こう。
# sed -i 's/^#auth\(\s\+required\)/auth\1/' /etc/pam.d/su
すると↓のように修正される。
#auth required pam_wheel.so use_uid ↓ コメントアウト(#)を外すauth required pam_wheel.so use_uid
/etc/sudoers を修正するためのコマンドを叩こう。
# sed -i 's/^# %wheel\(\s\+ALL=(ALL)\s\+ALL$\)/%wheel\1/' /etc/sudoers
すると↓のように修正される。
# %wheel ALL=(ALL) ALL ↓ コメントアウト(#)を外す%wheel ALL=(ALL) ALL
ちなみに、ここではsedコマンドを使って直接ファイルを編集しているが、普通に編集したい場合はvisudo コマンドを使おう。
一旦、VPSからログアウトし、先ほど作成した作業用ユーザでログインしてみよう。
[localhost ~]$ ssh <user_name>@XX.XX.XX.XX
ログインできればOKだ。
今度はsudoできることを確認しよう。
$ sudo whoami[sudo] password for <user_name>: ←作業用のパスワードを入力root
最後にsuコマンドが使えることを確認しよう。
$ su -Password: ←rootのパスワードを入力
コピペミスがなければ、特に問題は起きないはずだ!
では、引き続きrootで作業を行っていこう。
SSHのデフォルトポートはアタックを受けやすいので、変更してしまおう。
# sed -i 's/^#Port\s\+22/Port 50022/' /etc/ssh/sshd_config
すると↓のように修正される。
#Port 22 ↓ コメントアウト(#)を外し、"22"を任意の番号に変更Port 50022
ここでは、50022に変更しているが、ウェルノウンポート(0–1023)以外ならなんでもいい。
動的/プライベートポート(49152–65535)だと確実にポート番号の競合を回避できるので、この範囲で選ぶのが個人的には好みだ。
作業用ユーザでログイン及び、su/sudoができれば、rootがログインが必要はなくなる。
このタイミングでリモートからのrootログインを禁止してしまおう。
先ほど同様/etc/ssh/sshd_config を修正する。
# sed -i 's/^#PermitRootLogin\s\+yes/PermitRootLogin no/' /etc/ssh/sshd_config
すると↓のように修正される。
#PermitRootLogin yes ↓ コメントアウト(#)を外し、"yes"を"no"に変更PermitRootLogin no
このまま再起動しても問題ないが、念のため記述ミスがないかチェックを行おう。
# sshd -t
何も出なければOK。
/etc/ssh/sshd_config の設定はしくじるといきなり接続できなくなったりするので、sshdを再起動する前にチェックするクセをつけよう。
なお、さくらのVPS以外の場合、22番以外の通信がiptablesによって制限されている可能性があるので事前に確認したほうがいい。さくらのVPSはデフォルトフルオープンという漢らしい設定になっているので、このまま進めてもらって構わない。
では、反映するためにsshdを再起動する。
# service sshd restart
VPSからログアウトして、ログインを試してみよう。
[localhost ~]$ ssh <user_name>@XX.XX.XX.XXssh: connect to host XX.XX.XX.XX port 22: Connection refused
今まで通りのコマンドを打つと、拒否されるはずだ。
次にsshコマンドに-p オプションでポート番号を指定して、接続してみよう。
[localhost ~]$ ssh <user_name>@XX.XX.XX.XX -p 50022
今度はログインできたはずだ。
もう一度ログアウトし、rootでログインできないことも念のため確認しておこう。
[localhost ~]$ ssh root@XX.XX.XX.XX -p 50022
ちゃんと弾いてくれたね!
では、改めて作業用ユーザでログインしよう。
[localhost ~]$ ssh <user_name>@XX.XX.XX.XX -p 50022
これまではSSH接続にパスワード認証を使ってきたわけだけど、よりセキュアになるよう、公開鍵認証を使えるようにしよう。
作業用のユーザのホームディレクトリに、公開鍵用の空ファイルを作成し、パーミッションを設定しておく。
$ mkdir ~/.ssh $ chmod 700 ~/.ssh$ touch ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys
ここまで終わったら、ログアウトしておこう。次の作業はVPSではなく、自分の端末での作業になるので注意してほしい。
もし、秘密鍵・公開鍵を作ってない場合は作成しておこう。
[localhost ~]$ ssh-keygen -t rsa -C "your_email@example.com"
次に、自分の公開鍵をVPSへ転送しよう。
[localhost ~]$ scp -P 50022 ~/.ssh/id_rsa.pub <user_name>@XX.XX.XX.XX:~/.ssh/authorized_keys
scpコマンドでは、-P オプションで、先ほど変更したポート番号を指定することに注意してほしい。
改めてVPSへログイン。suしてrootになっておこう。
で、またまた/etc/ssh/sshd_config を修正する。
# sed -i 's/^#PubkeyAuthentication\s\+yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
すると↓のように修正される。
#PubkeyAuthentication yes ↓ コメントアウト(#)を外すPubkeyAuthentication yes
公開鍵認証を使えるようにしたので、パスワードログインを禁止してしまおう。
もはやおなじみとなった/etc/ssh/sshd_config を修正する。
# sed -i 's/^PasswordAuthentication\s\+yes/PasswordAuthentication no/' /etc/ssh/sshd_config
すると↓のように修正される。
PasswordAuthentication yes ↓ "yes"を"no"に変更PasswordAuthentication no
このタイミングでSSHに接続できるユーザを限定してしまおう。
/etc/ssh/sshd_config に"AllowUsers"を設定すればOKだ。
# echo "AllowUsers <user_name>" >> /etc/ssh/sshd_config
<user_name> の部分は、作業用ユーザの名前に置き換えよう。
ユーザ名をタイポするとログインできなくなるので、ユーザ名はコピペで入力することを推奨するぞ!
先ほど同様に、設定に問題がないかチェックして、sshdを再起動。
# sshd -t# service sshd restart
一度VPSからログアウトして、パスワード無しでログインできることを確認しよう。
[localhost ~]$ ssh <user_name>@XX.XX.XX.XX -p 50022
ログインできたら、suしてrootになっておいてね。
とりあえずSSHだけ許可する方針でいこう。
iptablesはviで直接ファイル弄ったほうが楽なんじゃないかという心の声を華麗にスルーして、愚直にコマンドでいくよ!( ・`ω・´)キリッ
これがないと詰む。
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ローカルは西川貴教ばりにオールOKにしておく。
# iptables -A INPUT -i lo -j ACCEPT
pingとかできるようにする。
# iptables -A INPUT -p icmp -j ACCEPT
手早くそこそこセキュアにするならこんな感じ。
もっと頑張りたい人は、ココとか見ながら、アレンジしてみよう。
プライベートIPアドレスとブロードキャストアドレスぐらいは拒否しておこう。
# iptables -A INPUT -s 10.0.0.0/8 -j DROP# iptables -A INPUT -d 10.0.0.0/8 -j DROP# iptables -A INPUT -s 172.16.0.0/12 -j DROP# iptables -A INPUT -d 172.16.0.0/12 -j DROP# iptables -A INPUT -s 192.168.0.0/16 -j DROP# iptables -A INPUT -d 192.168.0.0/16 -j DROP
# iptables -A INPUT -d 0.0.0.0/8 -j DROP# iptables -A INPUT -d 255.255.255.255 -j DROP
# iptables -A INPUT -f -j DROP
# iptables -A INPUT -p tcp -m state --state NEW ! --syn -j DROP
メールサーバ等のレスポンス低下につながるため、DROPではなくREJECTするのがお決まりらしい。
# iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
pingが1秒間に5回を超えたら破棄。
# iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit 1/s --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name input_icmp --hashlimit-htable-expire 300000 -j DROP
これを忘れるとSSH接続できなくなる(笑)ので必ずやろう。
SSHのポート番号を変えてる場合は、忘れずにその番号を指定すること。
# iptables -A INPUT -p tcp -m tcp --dport 50022 -j ACCEPT
この記事では50022をSSHのポート番号にしたので、それを指定している。
<port_number> に許可したい番号を入れて、次のコマンドを叩けばOK。
# iptables -A INPUT -p tcp -m tcp --dport <port_number> -j ACCEPT
例えば、Webサーバを立てる場合、HTTP(80番)を許可にすればOKだ。
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
送信は全て許可。受信と転送は全て破棄。受信と転送は明示的に設定した通信のみ許可する方針にした。
# iptables -P INPUT DROP # iptables -P OUTPUT ACCEPT# iptables -P FORWARD DROP
ちなみに、何も設定していない状態で、iptables -P INPUTDROP を実行すると、接続できなくなって詰むので最後に実行している。
設定した内容を確認してみよう。
# iptables -L --line-numbers -nChain INPUT (policy DROP)num target prot opt source destination1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/03 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/04 DROP all -- 10.0.0.0/8 0.0.0.0/05 DROP all -- 0.0.0.0/0 10.0.0.0/86 DROP all -- 172.16.0.0/12 0.0.0.0/07 DROP all -- 0.0.0.0/0 172.16.0.0/128 DROP all -- 192.168.0.0/16 0.0.0.0/09 DROP all -- 0.0.0.0/0 192.168.0.0/1610 DROP all -f 0.0.0.0/0 0.0.0.0/011 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp flags:!0x17/0x0212 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:113 reject-with tcp-reset13 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8 limit: up to 1/sec burst 5 mode srcip htable-expire 30000014 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5002215 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80Chain FORWARD (policy DROP)num target prot opt source destinationChain OUTPUT (policy ACCEPT)num target prot opt source destination
こんな感じで表示されたら、設定した内容を保存して、iptablesを再起動しよう。
# service iptables save# service iptables restart
念のため再度ログインできることを確認しておこう。
[localhost ~]$ ssh <user_name>@XX.XX.XX.XX -p 50022
ログインできたら、suしてrootになっておこう。
さくらの場合、だいたい最新だと思うが、念のためアップデートをかけておく。
$ yum -y update
手動でセキュリティパッチを当てるとかダルいので、自動で更新するようにしてしまおう。
まずはyum-cronをインストール。
$ yum -y install yum-cron
で、自動更新を有効にする。
# service yum-cron start# chkconfig yum-cron on
これでほっといても、最新のパッケージを使ってくれるようになるぞ!
さくらでは、IPv4同様、IPv6もフルオープンの設定になっている。
ホントは真面目に設定すべきところだが、メンドウなので、IPv6自体を止めてしまうのが楽。
/etc/sysctl.conf へそのための設定を追記しよう。
# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf# echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
追記したら、設定の反映をしよう。
# sysctl -p
最後に確認。inet6 addr という行がなければOKだ。
# ifconfig
さくらではデフォルトでPostfixが有効になっている。コイツもIPv6を使う設定が入っているので、IPv4のみ使うよう修正しておこう。
では/etc/postfix/main.cf を書き換えよう。
# sed -i 's/^inet_protocols\s\+=\s\+all$/inet_protocols = ipv4/' /etc/postfix/main.cf
すると↓のように修正される。
inet_protocols = all ↓ "all"を"ipv4"に変更inet_protocols = ipv4
明らかに不要だと自分で判断できるサービスは止めてしまおう。停止するサービスはこのあたりを参考に検討するとよさげ。
さくらの場合、デフォルトで結構不要なモノが停止されてたりするので、あまり頑張る必要はなさそう。
# chkconfig --list | grep 3:onacpid 0:off 1:off 2:on 3:on 4:on 5:on 6:offatd 0:off 1:off 2:off 3:on 4:on 5:on 6:offblk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:offcrond 0:off 1:off 2:on 3:on 4:on 5:on 6:offiptables 0:off 1:off 2:on 3:on 4:on 5:on 6:offirqbalance 0:off 1:off 2:off 3:on 4:on 5:on 6:offnetwork 0:off 1:off 2:on 3:on 4:on 5:on 6:offntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:offntpdate 0:off 1:off 2:on 3:on 4:on 5:on 6:offpostfix 0:off 1:off 2:on 3:on 4:on 5:on 6:offrsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:offsshd 0:off 1:off 2:on 3:on 4:on 5:on 6:offsysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:offyum-cron 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ここでは、先ほどIPv6を止めて不要になった、ip6tablesを停止してみよう。
# service ip6tables stop# chkconfig ip6tables off
他にも停止したいサービスがあったら、同じ要領で止めてしまおう。
サーバの初期セットアップも大事だけど日々の運用も大事だよね!
毎日サーバのログを自分で覗きに行くのは大変なので、定期的にログを見て、自動でメールを送ってくれるlogwatch を導入してみよう。
事前にroot宛のメールアドレスを設定しておこう。
/etc/aliases にアドレスを追記するだけでおk。<your_address> には自分のメールアドレスを入れよう。
# echo "root: <your_address>" >> /etc/aliases
では、反映しよう。
# newaliases
最後に送信できるか確認。
# date | mail root
日時だけが書かれたそっけないメールが届けば設定完了だ!
メールアドレスが設定できたので、 logwatchをインストールしよう。
# yum -y install logwatch
まずは、--printオプションをつけて実行してみよう。実行結果を標準出力してくれるぞ。
# logwatch --print
次に、オプション無しで実行してみよう。
# logwatch
先ほど設定したroot宛にメールが届くはずだ!
何度も不正アクセスを試みてこられると鬱陶しいよね。
そこで、一定回数ログインに失敗したIPアドレスをBANしてくれる、fail2ban を導入しよう。
# yum -y install fail2ban
SSHのポート番号を変えていると思うので、fail2banの設定にも反映しよう。
/etc/fail2ban/jail.conf のSSHのポート番号の記述をまとめて書き換える。
# sed -i 's/port=ssh/port=50022/' /etc/fail2ban/jail.conf
すると↓のように修正される。
port=ssh ↓ port=sshになってる箇所を、指定したポート番号に変更port=50022
では、サービスを起動しよう。
# service fail2ban start# chkconfig fail2ban on
デフォルトでは、SSHの認証に5回失敗した接続元をブロックしてくれる。
fail2banでは、SSHだけでなく、ApacheのDOS攻撃対策などもできる。適宜/etc/fail2ban/jail.conf を修正して、活用してほしい。
数は多くないがLinuxでもウィルスは存在する。
ってなわけで、オープンソースで提供されている、Clam AntiVirus(ClamAV) を導入してみよう。
# yum -y install clamd
まず、root権限で実行するように設定を変更する。
/etc/clamd.conf を更新するコマンドを叩こう。
# sed -i 's/^User\s\+clam$/#\0/' /etc/clamd.conf
すると↓のように修正される。
User clam ↓ コメントアウト(#)する#User clam
次にウィルス定義ファイルを最新化しよう。
# freshclam
準備が整ったら、サービスを起動しよう。
# service clamd start# chkconfig clamd on
最後に、動作確認だ。
# clamscan --infected --remove --recursive
ここまでは、不正侵入をされないための設定を色々してきたわけだけど、どれだけ頑張ってもくぐり抜けられる可能性をゼロにはできない。
そこで、万一に備え、不正侵入を検知するツールを導入してみよう。
Rootkit Hunterはその名の通り、rootkitを検出するためのツールだ。
# yum -y install rkhunter
# rkhunter --update# rkhunter --propupd
rootkitデータベースが最新になったら、検査してみよう。
# rkhunter --check --skip-keypress
Rootkit Hunterは以下のような観点でチェックしてくれる。
Tripwireはファイルの改ざんをチェックするツールだ。
# yum -y install tripwire
最初に、Tripwireを使用するための、サイトキーとローカルキーを生成しよう。
当然だけど、サイトキーとローカルキーには異なるパスフレーズを設定すること!
何回も入力を求められるけど、頑張って入力してあげよう。
# tripwire-setup-keyfiles・・・Enter the site keyfile passphrase: ←サイトキーのパスフレーズを入力Verify the site keyfile passphrase: ←サイトキーのパスフレーズを再入力Generating key (this may take several minutes)...Key generation complete.・・・Enter the local keyfile passphrase: ←ローカルキーのパスフレーズを入力Verify the local keyfile passphrase: ←ローカルキーのパスフレーズを再入力Generating key (this may take several minutes)...Key generation complete.----------------------------------------------Signing configuration file...Please enter your site passphrase: ←サイトキーのパスフレーズを入力Wrote configuration file: /etc/tripwire/tw.cfg・・・----------------------------------------------Signing policy file...Please enter your site passphrase: ←サイトキーのパスフレーズを入力Wrote policy file: /etc/tripwire/tw.pol・・・
ファイルの追加/削除時に、ファイルとディレクトリの両方で変更検知するのを防止しておこう。
/etc/tripwire/twcfg.txt を編集する。
# sed -i 's/^LOOSEDIRECTORYCHECKING\s\+=false$/LOOSEDIRECTORYCHECKING =true/' /etc/tripwire/twcfg.txt
すると↓のように修正される。
LOOSEDIRECTORYCHECKING =false ↓LOOSEDIRECTORYCHECKING =true
完了したら、暗号化した設定ファイルを作成する。
# twadmin -m F -c /etc/tripwire/tw.cfg -S /etc/tripwire/site.key /etc/tripwire/twcfg.txtPlease enter your site passphrase: ←サイトキーのパスフレーズを入力
サイトキーのパスフレーズを聞かれるので、先ほど設定したパスフレーズを入力しよう。
ポリシーのデフォルトの設定は/etc/tripwire/twpol.txt に書かれているが、これをそのまま使うと、
になっている場合があり具合が悪いため、環境に合わせてポリシーを最適化する。
最適化のためのPerlスクリプトがCentOSで自宅サーバー構築さんで公開されているので、そのまま拝借させていただく。
扱いやすいように事前にGistに置いておいたので、それを使うことにする。
# wget https://gist.githubusercontent.com/tmknom/035709050cf94ea512ce/raw/d397d9c81c09176413e44da29993841cf4b3bb45/twpolmake.pl -P /etc/tripwire
ダウンロードしたスクリプトを実行しよう。
# perl /etc/tripwire/twpolmake.pl /etc/tripwire/twpol.txt > /etc/tripwire/twpol.txt.new
完了したら、暗号化したポリシーファイルを作成する。
# twadmin -m P -c /etc/tripwire/tw.cfg -p /etc/tripwire/tw.pol -S /etc/tripwire/site.key /etc/tripwire/twpol.txt.newPlease enter your site passphrase: ←サイトキーのパスフレーズを入力
ここでも、サイトキーのパスフレーズを聞かれるので、先ほど設定したパスフレーズを入力しよう。
tw.cfgとtw.polを生成したら、元になったテキスト版の設定ファイルを必ず削除しよう。
暗号化前のファイルが残っていると、暗号化した意味がなくなってしまうぞ!
# rm -f /etc/tripwire/twcfg.txt*# rm -f /etc/tripwire/twpol.txt*
設定が完了したので、ベースラインデータベースを初期化する。
# tripwire --initPlease enter your local passphrase: ←ローカルキーのパスフレーズを入力
tripwireでは、ベースラインデータベースを基準にファイルの改竄チェックを行っていくことになる。
最後に、チェック方法を紹介しておこう。
# tripwire --check
レポートは、/var/lib/tripwire/report/ に格納される。
当然ながらファイルの更新があると、tripwireはレポートに報告を上げてくる。
ほっとくと永久に報告してくるので問題ない更新と判断できたらtripwireに教えてあげよう。
まずは、/var/lib/tripwire/report/ から最新のレポートを探しだそう
# ls -al /var/lib/tripwire/report/
次に、最新のtwrファイルに対し、次のコマンドを叩こう。
# tripwire -m u -r /var/lib/tripwire/report/xxxxxx.twrModified:[x] "/var/lib/tripwire/xxxx.twd"
すると、viが起動し、行頭に[x] がついた行が途中に見つかるはずだ。これがついているファイルは、次回以降のレポートからは取り上げられなくなる。
なので、内容を確認し、問題がなければそのまま、viでファイルを保存終了(:wq)すればOK。
逆に、次回以降も警告してほしい場合は、"x"を削除し[] としてから、保存終了しよう。
最終的にココに書いた内容をFabric化した記事を公開してるので良かったら見てね!
スクリプト化したことで、Vagrantでゴニョゴニョするのと変わらないレベルでセットアップができるようになって個人的には大満足w ∩( ・ω・)∩バンジャーイ
SELinuxはさくらのVPSの場合、デフォルトで無効になっている。
# cat /etc/sysconfig/selinuxSELINUX=disabled
ホントは有効にしてちゃんと設定したほうがいいと思うけど、SELinuxの知識があまりないから日和っちゃったw
そろそろマジメに勉強しようかな〜(=゚ω゚=)
今回の記事と後編の記事は、この本を教科書にして書き上げた。ブログの記事なので実は省略した部分も多いんだけど、しっかり学びたい場合は一読をオススメするよ!
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。