hachiNote

勉強したことをメモします。

さくらのVPSでUbuntuを使う

目的

注意!! この記事は2018年9月に書き留めていたメモ書きを元にしています。すでにだいぶ古い情報になっていますので、皆様の参考にはならないと思います。自分の備忘録として残しています。

長らく自宅サーバとして自分の家に物理マシン(といっても安いただのPC)を置いていましたが、物理を持つならではの面倒さがありますので、いよいよクラウドにサーバを置くことにしました。さくらのVPSを使って、Ubuntuを入れることにします。

クラウドサービスを本格に使うのは初めてだし、Ubuntuも初めてです(ずっとCentOS使ってた)。したがってこれは初心者のメモです。

標準OSインストールから、Ubuntu 16.04をインストールする

各種設定-OSインストールから標準OSインストールを選びます。 するとインストールするOSを選べるので、私の場合は「Ubuntu 16.04 amd64」を選びました。 あとはパスワードを設定して画面に従って進めればあっと言う間にインストール完了です。

ここで思いっきりはまったのは、Ubuntuのインストールって、rootのパスワードを設定しているわけではなくて、ubuntuという管理ユーザのパスワードを設定しているんですね。確かに画面上に表示されていたけど、ずっとCentOSを使ってた感覚で、SSHでログインする時にrootユーザで入ってました。そりゃログインできないですね。

インストール完了後、MacからSSHで入るには、

$ ssh ubuntu@***.***.***.***

でいけます。

いろいろ初期設定する

sudoできる一般ユーザ追加

最初間違えてuseraddを使ってしまったけど、それだとユーザディレクトリが作られないので、adduserを使う。 ここを参考にした。

http://www-creators.com/archives/241

$ sudo adduser newusername
Adding user `newusername' ...
Adding new group `newusername' (1001) ...
Adding new user `newusername' (1001) with group `newusername' ...
Creating home directory `/home/newusername' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for newusername
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
$ sudo gpasswd -a newusername sudo
Adding user newusername to group sudo

sshの鍵作成

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
 (省略)
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

id_rsaは手元に持ってくる。

SSHの設定を変更する

$ sudo vi /etc/ssh/sshd_config

ファイルの中の以下の部分を変更する。

PasswordAuthentication yes -> PasswordAuthentication no
Port 22 -> Port xxxxx
PermitRootLogin yes -> PermitRootLogin no
$ sudo service ssh restart

その後、ufwというツールでファイアウォールの設定をしてみたが、全然変更したSSHのポートが開かない。 ハマリにはまりまくった結果、この記事を見つけた。

https://vps-news.sakura.ad.jp/2017/12/19/ubuntu-ufw/

つまり、さくらVPS特有の問題で、ufwiptablesが競合してしまうみたいな話らしい。えーっ、もうスクリプトなしでインストールしちゃってるじゃないの。

iptablesは過去にも使ってたし、そのまま使っちゃうか、ということで、iptablesファイアウォールの設定をすることにする。 以下の記事を参考にした。

https://qiita.com/tpywao/items/76899267b9935038d9cd

$ sudo vi /etc/iptables/iptables.rule

ポート番号が22になっているところを変えたい番号に変える。

更新したiptables.ruleを取り込むため、以下のコマンドを打つ。

$ sudo iptables-restore < /etc/iptables/iptables.rule

これでやっと変更したポート番号でsshがつながった。

sshで繋げられたのはよかったが、もう一つはまったのはssh秘密鍵パスフレーズをかけたのに、2回目以降の接続時にはパスフレーズを聞かれなくなったこと(Macのターミナルからの接続時)。パスフレーズを聞かれないどころか、-i で秘密鍵の場所を指定しなくてもつながってしまう。ターミナルを終了させてやってみても同じ。なんだろ、もしかして誰でもログインできちゃう状態なの? と不安になった。

最初はMacのキーチェインのせいかと思ったけど、キーチェインには記録されていないし、-i を指定しなくてもいけるという説明にはなっていない。どうなってんだーとかなりはまった。

最終的にたどり着いたのは、ssh-agentという機能があるということ。ssh-addというコマンドでいろいろできるらしいです。

https://qiita.com/tukiyo3/items/504cb9d51c8df22725bd

記事を参考にしてssh-add -lと打ったら確かに何かが登録されていて、ssh-add -Dと打ったらその後のsshはちゃんとパスフレーズ聞かれました。自分の知らない間に勝手にssh-agentが使われていたのね。なるほどー、勉強になりました。

ファイアウォールの設定をカスタマイズ

さくらVPSのサーバ初期設定ガイドに、iptablesの例が書いてあったので、これを入れてみたい。

https://help.sakura.ad.jp/hc/ja/articles/206208121

Ubuntuの場合CentOSとはちょっとお作法が違うみたいなので、以下のサイトを参考にした。

https://qiita.com/hitobb/items/3ca7f47f7904f88c47be

変更前はこんな感じだった。

$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

iptabelsコマンドを打って一つずつ追加していく。さっきとは違ってiptables.rulesを直接編集するのではなく、NetFilterに直接設定を反映させていく感じになる。INPUTの後の1はINPUTのところの1行目に設定入れる、という意味。

$ sudo iptables -I INPUT 1 -p tcp --tcp-flags ALL NONE -j DROP
$ sudo iptables -I INPUT 1 -p tcp ! --syn -m state --state NEW -j DROP
$ sudo iptables -I INPUT 1 -p tcp --tcp-flags ALL ALL -j DROP

どうなったかを確認してみる。

$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
2 DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
3 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
8 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

最後に、再起動後もちゃんと設定が反映されるように、現在の設定をiptables.rulesに書き出しておく。ACCEPTの後の数字がなんか増えているけど、よくわからなかったけど特に気にしなくてもいいみたい。

$ sudo iptables-save | sudo tee /etc/iptables/iptables.rules
# Generated by iptables-save v1.6.0 on Sat Sep 8 20:00:43 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [209:23205]
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport xxxxx -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sat Sep 8 20:00:43 2018

なお、さっきのINPUTの1行目に追加するというところで間違って違う行に入れてしまった場合は、-Dで削除できるらしい。チェインというのはINPUTとかOUTPUTとかのこと。

iptables -D チェイン ルール番号

パッケージ等を全体的にアップデートする

$ sudo apt update
$ sudo apt upgrade

途中、GRUBが新しいバージョンあるけどローカルで変更があるのでどうする?と聞かれた。その場で設定ファイルのdiffを見たりできる。よくわからないけど、やってしまってなんかおかしかったら考えようということで、新しいバージョンの方を入れた。