Raspberry PiでWebサーバーの諸設定
先日Raspberry Pi3を導入し電子工作のツールとして使おうと考えていたのですが、立派なLinuxマシンを遊ばせておくのはもったいないと思い、また、とある必要性からWebサーバーに仕立て上げようと思い立ちました。他にLinuxマシンがあるのですが、あえてRPiで、ということでしょうか(汗)。
ここ数日Webサーバーの設定を済ませた後にラズパイをいじっているときにmicroSDカードを機械的に破損させるなどの事故があり、OSのインストールを2度繰り返す羽目になりました(苦笑)。来るべき3度目のため(?)に備忘録として設定の一部始終をここに書いておきます。初めての方にも参考になるかもしれませんが、ちゃんと動くかどうかの保証は致しかねます(汗)。なお、OSのバージョンはRaspbian JESSIE LITE 2017.4.10版、WiFiを使わずEthernet接続です。
起動前に非HDMIモニタへの対応
HDMI-VGA変換アダプタを使って非HDMIモニタにつなげる場合の設定。DDでmicroSDカードへOSのイメージを書き込んだ後に、RPiを起動する前に/boot/config.txtを編集してしまう。
hdmi_force_hotplug=1 hdmi_ignore_edid=0xa5000080 hdmi_group=2 hdmi_mode=39
raspi-configでいろいろ設定
RPiを起動後、ユーザー名pi、パスワードraspberryでログイン。対話型設定ソフトraspi-configでパスワード変更、host名変更、ローカライゼーション(タイムゾーン、キーボード設定)、インターフェイス設定(SSH有効化)、カードの拡張などを済ませておく。
$ip route
でRPiのローカルIPを確認。他のPCからSSHでログインを確認。これ以降、他の端末からSSH接続するので、キーボードやディスプレイをはずしておく。
キーボードのCTRLとCAPSを入れ替え
好みにより、CTRLキーとCAPSキーを入れ替える。/etc/default/keyboardを編集。
XKBOPTIONS="ctrl:swapcaps"
Xの設定っぽいけどこれで大丈夫。Xは使わないに。その後リブートして有効になる。
rootのパスワード変更
rootが無防備なのでまずはなによりパスワードを設定する。
$sudo passwd root
piユーザーを他のユーザー名(yuji)に変更。piでログインした状態で、
$sudo useradd -M foo $sudo gpasswd -a foo sudo $sudo passwd foo $exit
fooでログインし、
$sudo usermod -l yuji pi $sudo usermod -d /home/yuji -m yuji $sudo groupmod -n yuji pi $exit
yujiでログインし、fooを削除。
$sudo userdel foo $sudo pass yuji
IPを固定化(イーサーネット)しておく
ip routeで確認したローカルIPが192.168.1.10とする。/etc/dhcpcd.confを編集。末尾に、
inteface eth0 static ip_address=192.168.1.10/24 static routers=192.168.1.0 static domain_name_servers=192.168.1.0
その後リブート、他の端末からSSHでログインしてチェックする。
Sambaをインストール
Windowsとファイル共有するときに便利なのでいれておく。
$sudo apt-get install samba
/home/yuji/sambaにWindowsのファイルが見えるようにする。
/etc/samba/smb.confを編集、末尾に、
[share] path=/home/yuji/share read only=No browsaeble=Yes guest ok=Yes force user=yuji
$mkdir /home/yuji/share $sudo service samba restart
でsambaをrestart(エラーが出る場合は、smbdとnmbdをrestart)。
Windowsのエクスプローラで\\192.168.1.10を開くとshareのフォルダが見えるようになる。
RSA公開鍵認証方式でSSHログイン
クライアント側(Teratermなど)で鍵を作成。パスフレーズを入力し、Public keyとPrivate Keyのファイルを保存。それぞれ、
id_rsa.pub, id_rsaとする。id_rsa.pubをRPiへコピー。samba共有したフォルダにコピーしておく。サーバのRPi上で、
$mkdir ~/.ssh $chmod 700 ~/.ssh $mv ~/share/id_rsa.pub ~/.ssh $cd ~/.ssh $ssh-keygen -i -f id_rsa.pub >> authorized_keys
"uudecode failed."とエラーが出る場合は、
$ cat id_rsa.pub >> authorized_keys
PermitRootLogin no PasswordAuthentication no RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys
sshをrestart。これでrootでログインできなくし、パスワード入力によるログインも禁止になり、セキュリティレベルが上がる。
クライアント(Teratermなど)でアクセスするとき、秘密鍵のファイルid_rsaを指定してログイン。鍵ファイルはRPi上には置かない。id_rsaなどのファイルはパーミッションを600に設定しておくこと。
Apache2インストール
$sudo apt-get install apache2
ブラウザでhttp://192.168.1.10をアクセスして"Work It!"の表示を確認。
$sudo a2enmod userdir
これで~/public_htmlの下にアクセスできるようになる。ブラウザでhttp://192.168.1.10/~yuji/public_html/test.htmlなどで表示させてチェック。
CGIの設定
~/public_html/cgi-binの下にあるPerlやPythonプログラムを起動させるとする。
$sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
/etc/apache2/sites-aviailable/000-default.confを編集。
Include conf-available/serve-cgi-bin.conf
/etc/apache2/mods-available/mime.confを編集し、CGIプログラムの拡張子を設定。
AddHandler cgi-script .cgi .py .pl
/etc/apache2/conf-available/serve-cgi-bin.confを編集。
ScriptAlias /cgi-bin/ /home/*/public_html/cgi-bin <Directory "/home/*/public_html/cgi-bin">
これで~/public_html/cgi-binの下のCGIプログラムが有効になる。
/etc/apache2/mods-available/userdir.confを編集
<Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
OptionsにIndexesを取り去ると、ブラウザ上に(index.htmlがないディレクトリとかで)ディレクトリ構造が見えなくなる。
apache2をrestartすると反映されるので、~/public_html/cgi-bin/のプログラムをブラウザから起動させて確認。プログラムにはchmodしておく。
ポートの開放
光ルータにアクセス。ブラウザからhttp://192.168.1.1/を開く。
静的IPマスカレード設定で、ポート番号80と22を開いておく。この瞬間から世界中からSSHログイン攻撃が始まる。sudo lastbで確認できる。rootやpiのパスワードは絶対に設定しておくこと。
自宅IPのグローバルIPを把握する。
$curl httpbin.org/ip
このIPを別のネットワーク上の端末のブラウザで開いてみる。Apache2の設定のときの"Work It"の画面が出ることを確認。
ファイアーウォールの設定
SSH, WWW, Sambaのポートを許可する。それ以外を禁止。
$sudo apt-get install ufw $sudo ufw disable $sudo ufw default deny $sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22 $sudo ufw allow 8080 $sudo ufw allow 80 $sudo ufw allow 137/udp $sudo ufw allow 138/udp $sudo ufw allow 139/tcp $sudo ufw allow 445/tcp $sudo ufw enable
SSHのポート22番はLAN内のアクセスに制限しているが、外からのログインもやりたい場合はufw allow 22とする(ただし外からのSSH攻撃に会うので、セキュリティ対策をしっかりしておくこと)。
ファイアーオールの設定は$sudo ufw statusで確認。
MyDNS.jpのDDNS更新をcronで行う
独自ドメインを取得し、MyDNSを利用しているのでDDNSの更新の設定をしておく。
$crontab -e (以下の1行を追加して保存) */10 * * * * wget -q -O /dev/null http://(mydns.jp のマスターID):(mydns.jp のパスワード)@www.mydns.jp/login.html
Gmail経由でmailを出せるようにする
Gmailのアドレスはxxxx@gmail.com
Googleのログイン名をxxxx、パスワードをfoobarとする
$sudo apt-get install mailutils $sudo apt-get install ssmtp
/etc/ssmtp/ssmtp.confを編集
root=xxxx@gmail.com mailhub=smtp.gmail.com:587 hostname=xxxx@gmail.com AuthUser=xxxx AuthPass=foobar USESTARTTLS=YES
$mail xxxx@gmail.comでメールが送られてくるか確認。セキュリティの低いクライアントからのアクセスが有りましたとGoogleから知らせが来るのでGmailの設定で許可しておく。
Python関連をインストールする。
Pipではなぜか失敗するので、すべてapt-getでインストールする。
$sudo apt-get install python-pip $sudo apt-get install python-numpy $sudo apt-get install ipython $sudo apt-get install python3 $sudo apt-get install ipython3 $sudo apt-get install python3-pip $sudo apt-get install python3-numpy
など。Python3も入れておくがデフォルトはPython2しておく(そのほうがトラブルが少ない?)。