JF1DIR業務日誌(はてなblog版)

アマチュア無線局JF1DIRのアクティビティをつづっています。

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

これでVGAモニタに1360x768ピクセルの画面解像度で表示される。microSDをRPiに挿して電源を入れる。

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

とする。
/etc/ssh/sshd_configを編集

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の下にあるPerlPythonプログラムを起動させるとする。

$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しておく(そのほうがトラブルが少ない?)。