2011年06月08日

メモ書き

さくらのVPSを設定した時のメモが残ってたので貼っておく。

記述内容はアテにならないけど、参考リンクはアテになるんじゃないかと思う。


だいたいこの辺のページを参考にしてる。Ubuntuなので若干コマンドに違いがある気はする。

http://tanaka.sakura.ad.jp/archives/001065.html
http://www.yuyak.com/537



デフォルトだとCentOSなので、試しにUbuntuにしてみる。

会員メニュー → 契約情報 → 契約サービスの確認 → サーバ設定 → VPSホームに入る。

OS再インストール → カスタムOSインストール → Ubuntu 10.04 amd64を選択。

あとはインストールガイドに従ってインストール。
http://support.sakura.ad.jp/support/vps/menu_oscustom_ubuntu.shtml

これでインストールすると、rootのパスワードは無効で、登録したユーザからsudo suで昇格できるようになってる。

うちはドメインもさくらで取ってるので、設定しておく。

会員メニュー → 契約情報 → ドメインメニュー → ゾーン設定 → 変更。

Aレコードに適当なサブドメインを追加して、VPSサーバのIPアドレスを割り振る。そのうち反映される。



とりあえずsshでログイン。

$ ssh user@your_domain

まずはsshの設定をマシにすることから始める。

ポート番号が22だと機械的な攻撃を受ける可能性が高くなるので、ポートを適当な番号に変更。ついでにrootでのログインを禁止しておく。

$ sudo vi /etc/ssh/sshd_config

# ポートの変更
Port 22

Port 60022

# rootでのログイン禁止
PermitRootLogin yes

PermitRootLogin no

sshdを再起動する。設定を誤ると接続できなくなるけど、VPSコントロールパネルのリモートコンソールからは繋げるっぽいので多少は安心。

$ sudo /etc/init.d/ssh restart

ローカルの端末から、もっかい入ってみて、エラーになるか確認。

$ ssh user@your_domain
ssh: connect to host your_domain port 22: Connection refused

ポートを指定すれば入れることを確認。

$ ssh -p60022 user@your_domain

ホントは指定IPからのみログインできるようにしたいところだけど、自宅のIPは変わる恐れがあるので諦める。

パスワード認証だと総当りとか怖いので、鍵持ってる人だけ認証できるようにする。とりあえずVPSサーバ側でssh localhostでもして.sshディレクトリを作っておく。

$ ssh localhost

次にローカル側で鍵を作り、サーバに送っておく。Enter fileは空で。

$ cd ~/.ssh
$ ssh-keygen -t rsa
$ scp -P60022 id_rsa.pub user@your_domain:.ssh/authorized_keys

VPSサーバ側で権限を変更。

$ chmod 600 ~/.ssh/authorized_keys

ローカル側でログインできるか確認。

$ ssh -p60022 user@your_domain

鍵のパスフレーズは要求されるけど、サーバ側からパスワードを要求されずに入れたら成功。

最後に、パスワード認証でのログインを禁止する。

$ sudo vi /etc/ssh/sshd_config

#PasswordAuthentication yes

PasswordAuthentication no

$ sudo /etc/init.d/ssh restart

鍵を作ったサーバから入れることを確認。

$ ssh -p60022 user@your_domain

この場合もリモートコンソールからはログイン可能なので、鍵なくして家に入れなる的なことはない。



これでログインに対してはだいぶ安心になったけど、まだiptablesの設定もしてないのでポートがだいぶノーガード。

下記のページを参考に、iptablesで80と60022以外は塞ぐようにする。
http://d.hatena.ne.jp/Ubuntu/20080128/1201462048

$ vi ~/iptables


#!/bin/bash

# インタフェース名定義
LAN=eth0

# 内部ネットワークとして許可する範囲
LOCALNET=192.168.1.1/16

# iptablesのパス
IPTABLES=/sbin/iptables

# 初期化
$IPTABLES -F

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
$IPTABLES -P INPUT DROP # 受信はすべて破棄
$IPTABLES -P OUTPUT ACCEPT # 送信はすべて許可
$IPTABLES -P FORWARD DROP # 通過はすべて破棄

# 自ホストからのアクセスをすべて許可
$IPTABLES -A INPUT -i lo -j ACCEPT

# 内部からのアクセスをすべて許可
#$IPTABLES -A INPUT -s $LOCALNET -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
$IPTABLES -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
$IPTABLES -A INPUT -f -j DROP

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
$IPTABLES -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,136,137,138,139,445 -j DROP
$IPTABLES -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,136,137,138,139,445 -j DROP
$IPTABLES -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,136,137,138,139,445 -j DROP
$IPTABLES -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,136,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
$IPTABLES -N LOG_PINGDEATH
$IPTABLES -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
$IPTABLES -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
$IPTABLES -A LOG_PINGDEATH -j DROP
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
$IPTABLES -A INPUT -d 255.255.255.255 -j DROP
$IPTABLES -A INPUT -d 224.0.0.1 -j DROP

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# (Ubuntu/Debian系のみ)
# 180秒以内に10回以上のssh接続を試みたIPアドレスをシャットアウトする
$IPTABLES -A INPUT -p tcp --dport 60022 -m state --state NEW -m recent --set --name ssh_attack
$IPTABLES -A INPUT -p tcp --dport 60022 -m state --state NEW -m recent --update --seconds 180 --hitcount 10 --rttl --name ssh_attack -j LOG --log-prefix 'SSH attack: '
$IPTABLES -A INPUT -p tcp --dport 60022 -m state --state NEW -m recent --update --seconds 180 --hitcount 10 --rttl --name ssh_attack -j DROP

# 外部からのTCP22番ポート(SSH)へのアクセスを許可
$IPTABLES -A INPUT -p tcp --dport 60022 -j ACCEPT

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
if [ -s /root/.deny_ip ]; then
iptables -N DENY_HOST
for ip in `cat /root/.deny_ip`
do
iptables -A DENY_HOST -s $ip -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_HOST] : '
iptables -A DENY_HOST -s $ip -j DROP
iptables -I INPUT -j DENY_HOST
done
fi

# 上記のルールにマッチしなかったアクセスは破棄
$IPTABLES -A INPUT -j DROP
$IPTABLES -A FORWARD -j DROP


設定してみる。

$ sudo cp iptables /etc/network/if-pre-up.d/
$ sudo chmod 700 /etc/network/if-pre-up.d/iptables
$ sudo /etc/network/if-pre-up.d/iptables

反映されたか見てみる。書いたっぽい内容が出てくるはず。

$ sudo /sbin/iptables-save > foo.txt
$ cat foo.txt

ついでにnetstatで開放してるポートも見ておく。

$ netstat -l

あと、denyhostsというソフトを入れておくと、一定時間内に連続アクセスしてきたIPをhosts.denyに放り込めるらしい。

$ sudo apt-get install denyhosts

詳しい設定はこのファイルに書く。
$ vi /etc/denyhosts.conf

設定項目の内容は、このサイトを参考にした。
http://d.hatena.ne.jp/con_mame/20080126

これでsshとポートの設定はだいたい良いだろうか。



あとは必要なものを適当に入れる。

gccを入れておく。

$ apt-get install gcc

vimも入れておく

$ sudo apt-get install vim

HTTPサーバも入れておく。

$ sudo apt-get install apache2

これだけで「http://your_domain/」にアクセス可能になる。公開ディレクトリは「/var/www」。

PerlとPythonはいたけどRubyがいなかったので入れる。

$ sudo apt-get install ruby1.9

JDKも入れる。OpenJDKだと何かとアレなので、Oracleさんところから「jdk-xxx-linux-x64.bin」を落とす。
http://www.oracle.com/technetwork/java/javase/downloads/index.html

$ sudo sh jdk-xxx-linux-x64.bin
$ sudo mv jdk1.6.0_* /usr/local/jdk1.6

Scalaも入れておく。
http://www.scala-lang.org/downloads

$ tar xzvf scala-2.9.*.tgz
$ sudo mv scala-2.9.0.1 /usr/local/scala2.9

環境変数とかに入れておく。

$ vi ~/.bashrc
PATH=/usr/local/jdk1.6/bin:/usr/local/scala2.9/bin:$PATH

$ source ~/.bashrc

gitも入れておく。

$ sudo apt-get install git-core



とりあえず今日はこの辺で。