はじめてでも爆速でCentOS6.6(さくらのVPS)をセキュアにセットアップする方法まとめ

f:id:tmknom:20150116000843p:plain

爆速でセットアップを完了するため、極力コピペで設定できるようにしてみたよ(・∀・)

動作検証は、さくらのVPSで標準OSをインストールして行った。記事執筆時点ではCentOS6.6がインストールされたぞ。

# cat /etc/issue
CentOS release 6.6 (Final)
# uname -rs
Linux 2.6.32-504.3.3.el6.x86_64

お知らせ

本記事の内容をFabric化したスクリプトを公開!ぜひ試してみてね。

超速でCentOS6.6(さくらのVPS)をセットアップする俺史上最強のFabricスクリプトをさらす

rootのパスワード変更と作業用ユーザの作成

まずは、コンソールからSSHで接続しよう。

[localhost ~]$ ssh root@XX.XX.XX.XX

なお、サーバを起動してない場合は、事前に管理画面からサーバを起動しよう。詳しい方法はさくらのヘルプページを参考に。

rootのパスワード変更

さくらのVPSの場合、rootのパスワードはメールに直書きされて送られてくるので、最初に変更しておこう。

# passwd

作業用ユーザの作成

rootで直接作業をするとリスクが高いので、作業用のユーザを作成し、普段の作業はそちらで行うようにしよう。

後ほど、su/sudo権限をwheelグループに付与するので、ここで作成するユーザはwheelグループに所属させる。

# useradd <user_name> -G wheel
# passwd <user_name>

<user_name> の部分は、作成するユーザ名に置き換えてほしい。

設定ファイルの自動バージョン管理

これから色々な設定ファイルを弄るので、いつでも元に戻せるように、 etckeeper を入れておこう。

etckeeperはデフォルトで、/etcディレクトリ配下をgitでバージョン管理してくれるぞ。

etckeeperのインストール

# 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コマンドで操作したほうが簡単だ。

wheelグループにsu/sudo権限付与

wheelグループにsu権限付与

/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

wheelグループにsudo権限付与

/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のポート番号変更とrootログイン禁止

SSHのポート番号変更

SSHのデフォルトポートはアタックを受けやすいので、変更してしまおう。

/etc/ssh/sshd_config を修正するぞ。

# sed -i 's/^#Port\s\+22/Port 50022/' /etc/ssh/sshd_config

すると↓のように修正される。

#Port 22
 ↓ コメントアウト(#)を外し、"22"を任意の番号に変更
Port 50022

ここでは、50022に変更しているが、ウェルノウンポート(0–1023)以外ならなんでもいい。

動的/プライベートポート(49152–65535)だと確実にポート番号の競合を回避できるので、この範囲で選ぶのが個人的には好みだ。

リモートからのrootログイン禁止の設定

作業用ユーザでログイン及び、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の再起動

このまま再起動しても問題ないが、念のため記述ミスがないかチェックを行おう。

# sshd -t

何も出なければOK。

/etc/ssh/sshd_config の設定はしくじるといきなり接続できなくなったりするので、sshdを再起動する前にチェックするクセをつけよう。

なお、さくらのVPS以外の場合、22番以外の通信がiptablesによって制限されている可能性があるので事前に確認したほうがいい。さくらのVPSはデフォルトフルオープンという漢らしい設定になっているので、このまま進めてもらって構わない。

では、反映するためにsshdを再起動する。

# service sshd restart

SSHの接続確認

VPSからログアウトして、ログインを試してみよう。

[localhost ~]$ ssh <user_name>@XX.XX.XX.XX
ssh: 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を許可するユーザの制限

このタイミングでSSHに接続できるユーザを限定してしまおう。

/etc/ssh/sshd_config"AllowUsers"を設定すればOKだ。

# echo "AllowUsers <user_name>" >> /etc/ssh/sshd_config

<user_name> の部分は、作業用ユーザの名前に置き換えよう。

ユーザ名をタイポするとログインできなくなるので、ユーザ名はコピペで入力することを推奨するぞ!

公開鍵認証でのSSH接続の確認

先ほど同様に、設定に問題がないかチェックして、sshdを再起動。

# sshd -t
# service sshd restart

一度VPSからログアウトして、パスワード無しでログインできることを確認しよう。

[localhost ~]$ ssh <user_name>@XX.XX.XX.XX -p 50022

ログインできたら、suしてrootになっておいてね。

iptables(ファイアウォール)の設定

とりあえずSSHだけ許可する方針でいこう。

iptablesはviで直接ファイル弄ったほうが楽なんじゃないかという心の声を華麗にスルーして、愚直にコマンドでいくよ!( ・`ω・´)キリッ

接続済の通信は全て許可

これがないと詰む。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

ローカルループバックアドレスを許可

ローカルは西川貴教ばりにオールOKにしておく。

# iptables -A INPUT -i lo -j ACCEPT

ICMPを許可

pingとかできるようにする。

# iptables -A INPUT -p icmp -j ACCEPT

各種攻撃対策

手早くそこそこセキュアにするならこんな感じ。

もっと頑張りたい人は、ココとか見ながら、アレンジしてみよう。

IP偽装対策

プライベートIPアドレスとブロードキャストアドレスぐらいは拒否しておこう。

プライベート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

IDENT port probe対策

メールサーバ等のレスポンス低下につながるため、DROPではなくREJECTするのがお決まりらしい。

# iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

Ping Flood対策

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接続できなくなる(笑)ので必ずやろう。

SSHのポート番号を変えてる場合は、忘れずにその番号を指定すること。

# iptables -A INPUT -p tcp -m tcp --dport 50022 -j ACCEPT 

この記事では50022をSSHのポート番号にしたので、それを指定している。

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 INPUT DROP を実行すると、接続できなくなって詰むので最後に実行している。

確認と設定反映

設定した内容を確認してみよう。

# iptables -L --line-numbers -n

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
4    DROP       all  --  10.0.0.0/8           0.0.0.0/0
5    DROP       all  --  0.0.0.0/0            10.0.0.0/8
6    DROP       all  --  172.16.0.0/12        0.0.0.0/0
7    DROP       all  --  0.0.0.0/0            172.16.0.0/12
8    DROP       all  --  192.168.0.0/16       0.0.0.0/0
9    DROP       all  --  0.0.0.0/0            192.168.0.0/16
10   DROP       all  -f  0.0.0.0/0            0.0.0.0/0
11   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp flags:!0x17/0x02
12   REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:113 reject-with tcp-reset
13   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 300000
14   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:50022
15   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80

Chain FORWARD (policy DROP)
num  target     prot opt source               destination

Chain 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

これでほっといても、最新のパッケージを使ってくれるようになるぞ!

IPv6と不要サービスの停止

IPv6の無効化

さくらでは、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

PostfixIPv6無効化

さくらではデフォルトで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:on

acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
blk-availability    0:off   1:on    2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:off   3:on    4:on    5:on    6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpdate         0:off   1:off   2:on    3:on    4:on    5:on    6:off
postfix         0:off   1:off   2:on    3:on    4:on    5:on    6:off
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sysstat         0:off   1:on    2:on    3:on    4:on    5:on    6:off
yum-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のメールアドレス設定

事前にroot宛のメールアドレスを設定しておこう。

/etc/aliases にアドレスを追記するだけでおk。 <your_address> には自分のメールアドレスを入れよう。

# echo "root: <your_address>" >> /etc/aliases

では、反映しよう。

# newaliases

最後に送信できるか確認。

# date | mail root

日時だけが書かれたそっけないメールが届けば設定完了だ!

logwatchのインストール

メールアドレスが設定できたので、 logwatchをインストールしよう。

# yum -y install logwatch

logwatchの動作確認

まずは、--printオプションをつけて実行してみよう。実行結果を標準出力してくれるぞ。

# logwatch --print

次に、オプション無しで実行してみよう。

# logwatch

先ほど設定したroot宛にメールが届くはずだ!

ブルートフォースアタック対策

何度も不正アクセスを試みてこられると鬱陶しいよね。

そこで、一定回数ログインに失敗したIPアドレスをBANしてくれる、 fail2ban を導入しよう。

fail2banのインストール

# yum -y install fail2ban

fail2banの設定

SSHのポート番号を変えていると思うので、fail2banの設定にも反映しよう。

/etc/fail2ban/jail.confSSHのポート番号の記述をまとめて書き換える。

# 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だけでなく、ApacheDOS攻撃対策などもできる。適宜 /etc/fail2ban/jail.conf を修正して、活用してほしい。

ウィルス対策ソフトの導入

数は多くないがLinuxでもウィルスは存在する。

ってなわけで、オープンソースで提供されている、 Clam AntiVirus(ClamAV) を導入してみよう。

Clam AntiVirusのインストール

# 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 Hunterはその名の通り、rootkitを検出するためのツールだ。

Rootkit Hunterのインストール

# yum -y install rkhunter

rootkitデータベースのアップデート

# rkhunter --update
# rkhunter --propupd

Rootkit Hunterの確認

rootkitデータベースが最新になったら、検査してみよう。

# rkhunter --check --skip-keypress

Rootkit Hunterは以下のような観点でチェックしてくれる。

  • コマンドが改ざんされていないか
  • rootkitやワームが仕掛けられてないか
  • バックドアトロイの木馬が仕掛けられてないか
  • 起動ファイルに不審な仕掛けがないか
  • パスワードの設定されていないアカウントはないか
  • SSHでrootログインは禁止されているか
  • SSHバージョン1が禁止されているか
  • syslog/rsyslogデーモンは稼働しているか
  • /dev配下に不審なファイルがないか

Tripwire

Tripwireはファイルの改ざんをチェックするツールだ。

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.txt
Please 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.new
Please enter your site passphrase: ←サイトキーのパスフレーズを入力

ここでも、サイトキーのパスフレーズを聞かれるので、先ほど設定したパスフレーズを入力しよう。

テキスト版の設定ファイルの削除

tw.cfgとtw.polを生成したら、元になったテキスト版の設定ファイルを必ず削除しよう。

暗号化前のファイルが残っていると、暗号化した意味がなくなってしまうぞ!

# rm -f /etc/tripwire/twcfg.txt*
# rm -f /etc/tripwire/twpol.txt*

ベースラインデータベースの初期化

設定が完了したので、ベースラインデータベースを初期化する。

# tripwire --init
Please 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.twr

Modified:
[x] "/var/lib/tripwire/xxxx.twd"

すると、viが起動し、行頭に [x] がついた行が途中に見つかるはずだ。これがついているファイルは、次回以降のレポートからは取り上げられなくなる。

なので、内容を確認し、問題がなければそのまま、viでファイルを保存終了(:wq)すればOK。

逆に、次回以降も警告してほしい場合は、"x"を削除し [] としてから、保存終了しよう。

まとめ

最終的にココに書いた内容をFabric化した記事を公開してるので良かったら見てね!

スクリプト化したことで、Vagrantでゴニョゴニョするのと変わらないレベルでセットアップができるようになって個人的には大満足w ∩( ・ω・)∩バンジャーイ

追記:SELinuxについて

SELinuxはさくらのVPSの場合、デフォルトで無効になっている。

# cat /etc/sysconfig/selinux
SELINUX=disabled

ホントは有効にしてちゃんと設定したほうがいいと思うけど、SELinuxの知識があまりないから日和っちゃったw

そろそろマジメに勉強しようかな〜(=゚ω゚=)

参考書籍

Linuxサーバーセキュリティ徹底入門

今回の記事と後編の記事は、この本を教科書にして書き上げた。ブログの記事なので実は省略した部分も多いんだけど、しっかり学びたい場合は一読をオススメするよ!