webサーバのログ管理の必要性はわかっているけど,
いちいちログファイルを見てるのはめんどくさい。。
そこでAWStatsを導入します。
これを導入することで,webブラウザでApacheログを視覚的に(グラフとか)で確認することが出ます。
インストール自体は簡単。設定すれば動作します。
$ sudo apt-get install awstats
/etc/awstats以下にデフォルトの設定ファイルawstats.model.confが生成されているので,ファイルをコピーして編集。
$ cd /etc/awstats
$ sudo cp awstats.model.conf awstats.myhost.jp.conf
$ sudo vim awstats.myhost.jp.conf
以下のように追加or書き換え
LogFile="apacheのログファイルの位置"
LogFormat = 1
LogFormat = "%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
↑Apacheのログ出力設定がcombinedのとき用
SiteDomain="ドメイン名"
Lang="jp"
Apacheのドキュメントルートにアイコンへのパスをリンクする
$ sudo ln -s /usr/share/awstats/icon /var/www/awstats-icon
Apacheのログ解析および結果の出力(cronにこれらを登録すれば,毎日自動解析してくれます
$ sudo /usr/lib/cgi-bin/awstats.pl -config=myhost.jp -update
$ sudo /usr/lib/cgi-bin/awstats.pl -config=myhost.jp -output > /var/www/awstats.html
Raspberry PiにOpenCVをインストールします。
詳しくは過去の記事を参考にしてください。
必要なソフトのインストール!余分なものも入ってるけど気にしないっ
必要に応じて,追加でインストールしてください
$ sudo apt-get install cmake pkg-config mencoder mplayer libgtk2.0.0 libgtk2.0-dev libjpeg62 libjpeg62-dev libjpeg62-dbg libpng12-dev libpng12-0 ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libswscale-dev libswscale2 libavfilter2 libavfilter-dev libdc1394-22 libdc1394-22-dev libgstreamer0.10-0 libgstreamer0.10-dev libgstreamer0.10-cil-dev libgstreamer-plugins-base0.10-0 libgstreamer-plugins-base0.10-dev zlib1g zlib1g-dev libxine1-ffmpeg libxine1-bin libunicap2 libunicap2-dev libdc1394-utils swig libv4l-0 libv4l-dev python-numpy python-dev
あとはソースをダウンロードしてきて,解答して,Makeするだけ!
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON -D BUILD_EXAMPLES=ON ../opencv-2.4.5
make -j2
sudo make install
sudo ldconfig
外部から自宅のサーバにアクセスするためにはDDNSのサービスを使ってやる必要があります.
ここでは,mydnsというサービスを使ってDDNSの設定をしていきます.
$ sudo vim ddns.sh
#!/bin/bash
user=hoge
pass=hogepass
wget -a /var/log/ddns.log -O /tmp/ddns_tmp.html --http-user=${user} --http-passwd=${pass} "http://www.mydns.jp/login.html"
$ sudo chown root:root ddns.sh
$ sudo chmod 700 ddns.sh
$ sudo vim /etc/crontab
以下を追加
*/10 * * * * root sh 上で作ったファイルへのパス
Raspberry Piのメモリ量が気になるので,仮想メモリであるSwapファイルの設定容量を変更する。
まずは,現在の仮想メモリの量を確認する。
$ swapon -s
コマンドを実行すると以下の文が出てきて,メモリが100Mくらいだとわかる
Filename Type Size Used Priority
/var/swap file 102396 hoge -1
Raspberry Piでは,仮想メモリをdphys-swapfileというサービスで管理しているので,
これを止めてから,設定の変更を行なっていく
$ sudo service dphys-swapfile stop
$ sudo vim /etc/dphys-swapfile
このファイル内のCONF_SWAPSIZEの値を変更する
例:CONF_SWAPSIZE=1024
$ sudo service dphys-swapfile start
これで完了!仮想メモリの容量が変更されたかを確認する。
$ swapon -s
Filename Type Size Used Priority
/var/swap file 1048572 hoge -1
自宅のネットワークに外部からアクセスするためにVPNを導入します(`・ω・´)
iPhoneやiPadでも使いたい。 & 簡単に導入したい。のでPPTPでVPNサーバを構築します。
PPTPで用いられている認証プロトコルはクラックされています(ここ参照)
ただ,iPhoneなどで気軽に使えるVPNサーバは,PPTPだけといっても過言ではないので,これを使います。
iPhoneをjailbreakしてOpenVPNを入れれば,話は別ですが。。
$ sudo apt-get install 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
複数のユーザを設定したい場合は,ここに複数記述するのかな?
$ sudo vim /etc/ppp/chap-secrets
以下を追加
hoge * hogepass *
$ 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
外部からのアクセスは,ルータの設定が必要!
・ルータのPPTPパススルーを許可する
・プロトコルの47番(GRE)とTCPの1723番のポートをVPNサーバに開放する
サーバを外部に公開するにあたり,このままだとセキュリティ的に不安で仕方がないです。。
なので,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] '
WebサーバへのアクセスをすべてHTTPSで通信するように設定する。
$ cd /var/www
$ sudo vim .htaccess
以下追加項目
SSLRequireSSL
これでwww以下へのアクセスはすべてHTTPSで行われる。apache.confなどに記述されている
AllowOverride none を
AllowOverride All に変更する
例:
<directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride none
</Directory>
↓
<directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>
あとはapache再起動で設定完了!
httpでアクセスすると403エラーがでるようになる。
外部から安全にアクセスするために,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を使用するために必要なファイルを生成することができました。$ 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
以下の内容を/etc/apache2/sites-enabled/sslに追加
<virtualhost _default_:443>
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
</VirtualHost>
$ 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
$ sudo service apache2 restart
で,問題が無ければ完成!!Raspberry Piの初期設定をします(`・ω・´)
細かい説明は抜きで,設定の流れを書いてきますっb
OSのインストールは,Macを使って行なっていきます。
・Raspberry Piと付属するケーブル類
・インストールするOSのイメージ
・キーボード
・OSをインストールするSDカード
・Mac OS Xが動いているPC
・怖いもの知らずな心(失敗するとMacが起動しなくなります。。
Downloads | Raspberry Piから最新版のOSをダウンロード
Raspbian “wheezy”(Debian)とArch Linuxの二種類がありますが,好きな方をどうぞb
私は使い慣れたDebianベースのRaspbianの方で進めます。
まず,OSをインストールするSDカードをフォーマットします。
これは普通にディスクユーティリティを開いて,FATでフォーマットしてあげれば終了です!
ダウンロードしてきたzipファイルを解凍して,isoファイルを取り出して,
ターミナルを開いてゴニョゴニョするとインストールの完了です!!
。。。
しょうじき,めんどくさい。。&失敗するとMacにもダメージが。。
でも大丈夫!便利なツールが公開されています。
その名もRPi-sd card builder!!
これをダウンロードしてきて,実行して,インストールするisoファイルとインストール先のSDを指定してあげれば完了です。
ターミナルを使って,自分でインストールしたい方はここなどを参照
初回起動時に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