2013年3月26日火曜日

PPTPでVPNサーバ構築

自宅のネットワークに外部からアクセスするためにVPNを導入します(`・ω・´)
iPhoneやiPadでも使いたい。 & 簡単に導入したい。のでPPTPでVPNサーバを構築します。

※注意
PPTPで用いられている認証プロトコルはクラックされています(ここ参照)
ただ,iPhoneなどで気軽に使えるVPNサーバは,PPTPだけといっても過言ではないので,これを使います。
iPhoneをjailbreakしてOpenVPNを入れれば,話は別ですが。。

PPTPのインストール

sudo apt-get install pptpd

pptpdの設定

ここでは,以下ように動作するように設定をしていきます.
・VPNサーバのIP:192.168.0.11
・クライアントに割り振られるIP:192.168.0.201~210
・ログインユーザ名:hoge
・ログインパス:hogepass
sudo vim /etc/pptpd.conf
以下を追加
# VPNサーバを動かすPCのIPアドレス
localip 192.168.0.11
# VPNでアクセスしてきたクライアントのIPアドレス
remoteip 192.168.0.201-210


sudo vim /etc/ppp/ptpd-options 
以下を追加
ms-dns 10.0.1.1
noipx
mtu 1490
mru 1490

pptpdでアクセスするユーザを登録

複数のユーザを設定したい場合は,ここに複数記述するのかな?
sudo vim /etc/ppp/chap-secrets

以下を追加
hoge * hogepass *

その他の設定

・IPフォワーディング
sudo vim /etc/sysctl.conf

コメントアウトされているので,有効化(頭に付いている#を消す
net.ipv4.ip_forward=1
・ファイヤーウォール
以前設定したfirewall.shに追加する。
sshの設定の下辺がいいかなー。
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -i eth0 -p 47 -j ACCEPT
iptables -A OUTPUT -p 47 -j ACCEPT
iptables -A INPUT -i ppp+ -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
・設定の有効化
sudo reboot

これでOK!iPhoneやPCから接続できるか確認。

外部からのアクセスは,ルータの設定が必要!
・ルータのPPTPパススルーを許可する
・プロトコルの47番(GRE)とTCPの1723番のポートをVPNサーバに開放する



2013年3月25日月曜日

iptablesでファイヤーウォール設定

サーバを外部に公開するにあたり,このままだとセキュリティ的に不安で仕方がないです。。
なので,iptablesを使って,ファイヤーウォールを構築します(`・ω・´)

と言っても,以下のサイトを参考?(ほとんどまんま。。)にさせていただいています。
ブローヴちゃん:Debian に iptables を設定
ほんとうにありがとうございます!!

以下のファイルを適当な場所に作成。
#! /bin/sh
# firewall.sh

# 内部ネットワークのネットマスク取得
WANINT="eth0"
LOCALNET_MASK=`ifconfig $WANINT|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $WANINT|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

MY_SSHD_CONFIG=/etc/ssh/sshd_config

iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Loopback
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -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関連、Dropbox関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445,17500 -j DROP
iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445,17500 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445,17500 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445,17500 -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 -N LOG_PORTSCAN
iptables -A LOG_PORTSCAN -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A LOG_PORTSCAN -j LOG --log-level info --log-prefix '[IPTABLES PORTSCAN] '
iptables -A LOG_PORTSCAN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j LOG_PORTSCAN

# 不正パケット対策
iptables -N LOG_NEWSYNCHECK
iptables -A LOG_NEWSYNCHECK -j LOG --log-prefix '[IPTABLES NEWSYNCHECK] '
iptables -A LOG_NEWSYNCHECK -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG_NEWSYNCHECK

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
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

# 確立に成功した tcp 接続は許可
iptables -A INPUT  -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# Ping 送受信
iptables -A INPUT  -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT  -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

# DNS 送信
iptables -A INPUT  -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT

# HTTP, HTTPS, POP3(SSL), IMAP, SMTP(TLS/STARTTLS, SSL), git, hkp 送信
iptables -A OUTPUT -p tcp -m state --state NEW -m multiport --dports 80,443,995,993,587,465,9418,11371 -j ACCEPT

# HTTP, HTTPs 受信
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dport 80,443 -j ACCEPT

# SSH 受信 / ブルートフォース攻撃対策
# sshd_config ファイルの中からポート番号を指定している箇所を探す
SSHD_LISTEN_PORT=`sed -e 's/^Port\s\+\([0-9]\+\)/\1/p' -e d $MY_SSHD_CONFIG`
iptables -N LOG_SSHBRUTEFORCE
iptables -A LOG_SSHBRUTEFORCE -m limit --limit 3/min --limit-burst 4 -j ACCEPT
iptables -A LOG_SSHBRUTEFORCE -j LOG --log-level info --log-prefix '[IPTABLES SSHBRUTEFORCE] '
iptables -A LOG_SSHBRUTEFORCE -j DROP
iptables -A INPUT -p tcp -m state --state NEW --dport $SSHD_LISTEN_PORT -j LOG_SSHBRUTEFORCE

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        iptables -I INPUT -s $ip -j DROP
    done
fi

# 上記のルールにマッチしなかったアクセスで外部からのものはログを記録(その後自動的に破棄)
iptables -A INPUT ! -s $LOCALNET  -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES NOMATCHINPUT] '


作成したファイルのオーナをrootに変更して,パーミッションを700にしておきます。
あとは/etc/rc.localに登録して,起動時に実行するように設定します。



WebからのアクセスをすべてHTTPSにする

WebサーバへのアクセスをすべてHTTPSで通信するように設定する。

.htaccessにSSLで通信するように記述

cd /var/www
sudo vim .htaccess

以下追加項目
SSLRequireSSL
これでwww以下へのアクセスはすべてHTTPSで行われる。

.htaccessを使用出来るようにapacheを設定

apache.confなどに記述されている
AllowOverride none を
AllowOverride All に変更する

例:
        
                Options FollowSymLinks MultiViews
                AllowOverride none
        
 ↓
        
                Options FollowSymLinks MultiViews
                AllowOverride All
        



あとはapache再起動で設定完了!
httpでアクセスすると403エラーがでるようになる。




HTTPSでWebページを公開

外部から安全にアクセスするために,SSLを使ってHTTPSでの暗号化通信を導入します(`・ω・´)

まず,SSLを使用するためにopensslをインストールします。(apacheが入っている前提で話を進めます
sudo apt-get update
sudo apt-get install openssl

インストールできたら,opensslを使って自己証明書と鍵を作っていきます。
作業するフォルダに移動して,ルートになっておきます。
mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
sudo su

ここから,コマンド実行後に入力項目があるので,適宜入力していきます。

秘密鍵の作成

# openssl genrsa -aes128 1024 > server.key

以下表示内容
Generating RSA private key, 1024 bit long modulus
......................++++++
..++++++
e is 65537 (0x10001)
Enter pass phrase:  [パスワード入力]
Verifying - Enter pass phrase:  [パスワード入力]


公開鍵の作成

# openssl req -new -key server.key > server.csr

以下表示内容
Enter pass phrase for server.key:  [さっき入力したパスワード]
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:  [てきとーに入力:JP]
State or Province Name (full name) [Some-State]:  [てきとーに入力:Nara]
Locality Name (eg, city) []:  [てきとーに入力:Nara-Shi]
Organization Name (eg, company) [Internet Widgits Pty Ltd]:  [てきとーに入力:Connecting The Dots]
Organizational Unit Name (eg, section) []:  [てきとーに入力:]
Common Name (e.g. server FQDN or YOUR name) []:  [てきとーに入力:]
Email Address []:  [てきとーに入力:]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:  [空白]
An optional company name []:  [空白]


証明書の作成

# openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt

以下表示内容
Signature ok
subject=/C=JP/ST=Nara/L=Nara-Shi/O=Connecting The Dots/CN=
Getting Private key
Enter pass phrase for server.key:  [さっき入力したパスワード]


ここまでで,SSLを使用するために必要なファイルを生成することができました。
証明書は定期的に更新する必要があります。(-daysのオプションで有効期限を指定しています

あとは,apacheの設定を行なっていきます。

sslの有効化

cd /etc/apache2/mods-enabled
sudo ln -s ../mods-available/ssl.conf ssl.conf
sudo ln -s ../mods-available/ssl.load ssl.load
sudo a2enmod ssl 
cd /etc/apache2/sites-enabled
sudo ln -s ../sites-available/default-ssl ssl

sslの設定

以下の内容を/etc/apache2/sites-enabled/sslに追加

 SSLProtocol all -SSLv2
 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
 SSLCertificateFile /etc/apache2/ssl/server.crt
 SSLCertificateKeyFile /etc/apache2/ssl/server.key


apache再起動時のパスワード入力をなくす

cd /etc/apache2/ssl
sudo su
# mv server.key server.key.back
# openssl rsa -in server.key.back > server.key

以下表示内容
Enter pass phrase for server.key.back:  [上で入力したパスワードを入力]
writing RSA key



最後にapache再起動

sudo service apache2 restart
で,問題が無ければ完成!!



ここの内容は以下のサイトを参考にさせていただいています。




Raspberry Pi届いたー。OSインストール & 初期設定

Raspberry Piの初期設定をします(`・ω・´)
細かい説明は抜きで,設定の流れを書いてきますっb
OSのインストールは,Macを使って行なっていきます。

準備するもの

・Raspberry Piと付属するケーブル類
・インストールするOSのイメージ
・キーボード
・OSをインストールするSDカード
・Mac OS Xが動いているPC
・怖いもの知らずな心(失敗するとMacが起動しなくなります。。

OSのダウンロード

Downloads | Raspberry Piから最新版のOSをダウンロード
Raspbian “wheezy”(Debian)とArch Linuxの二種類がありますが,好きな方をどうぞb
私は使い慣れたRaspbianの方で進めます。

OSのインストール

まず,OSをインストールするSDカードをフォーマットします。
これは普通にディスクユーティリティを開いて,FATでフォーマットしてあげれば終了です!

ダウンロードしてきたzipファイルを解凍して,isoファイルを取り出して,
ターミナルを開いてゴニョゴニョするとインストールの完了です!!

。。。

しょうじき,めんどくさい。。&失敗するとMacにもダメージが。。

でも大丈夫!便利なツールが公開されています。
その名もRPi-sd card builder!!
これをダウンロードしてきて,実行して,インストールするisoファイルとインストール先のSDを指定してあげれば完了です。

ターミナルを使って,自分でインストールしたい方はここなどを参照


Raspbianの初期設定

初回起動時にRaspi-configが表示されます。
ここで,以下を選択して,処理を実行します.
(タブと方向キーで移動して,エンターで確定します。
expand_rootfs
初期設定ではSDカードのごく一部しか使用できないので,すべての領域を使用できるように設定
configure_keyboard
Generic 105-key (Intl) PC からの Japanese からの Japanese (OADG 109A) でOK
人の好みで変えてください。
change_pass
初期ユーザ pi のパスワードを設定
change_timezone
タイムゾーンの設定。Asia からの Tokyo でOK
ssh
sshを有効にして,ネットワークからのアクセスを許可

で,再起動して,以下のコマンドを実行して完了!
sudo apt-get update
sudo apt-get upgrade
sudo reboot

再度,設定したい場合は以下のコマンドを実行
sudo raspi-config