さくらのVPSを借りて CentOS8 x86_64 をインストールします。
今回 DockerCompose を使用したいので、さくらのVPSの起動スクリプトを使用してインストールします。簡単で便利です。
また、新規ユーザーを作成して 公開鍵認証 を使用したログインができるところまで今回は進めていきます。
今回の学習内容
さくらのVPS
今回は、さくらのVPS を使いました。契約したプランは以下のとおりです。
二週間の無料期間がありましたが、すぐに本契約したので無料期間中の制限はありません。
ゾーンは 東京第2ゾーン です。
プラン | CPU | メモリ | 標準容量(SSD) | 月額料金/年額料金 |
---|---|---|---|---|
1GB | 仮想2Core | 1GB | 50GB | 900円/9,900円 |
OSインストール
まずは、OS をインストールするために右上の「各種設定」ボタンから OSインストール をクリックします。
OSインストール形式の選択
OSをインストールする形式を選択します。今回は「標準OS」を選択します。
標準OSインストール
インストールするOSを選択します。
さくらVPS は デフォルトで CentOS が使用されているので、今回は現時点(2020/10)で一番新しい CentOS8 x86_64 を選択します。
管理者ユーザ(root)のパスワードを設定する必要があるので、パスワード生成ツール の 最強 を指定して作成したパスワードを設定します。
- root パスワードは推測されやすいパスワードを設定するべきではありません。
スタートアップスクリプト
サーバーセットアップ後の初回起動時に自動で実行してくれるスクリプトを設定できます。CentOS 7 で使用できた スクリプトも徐々に CentOS 8 で使用できるようになっていっているみたいです。
今回は Docker を使用したいので、さくらの公式スクリプト「DockerCompose」を選択しています。
- サーバーの初期起動後に選択したスクリプトが実行されます。
パケットフィルタ
通信制御をサーバーからではなく管理画面から設定できます。
デフォルトでは SSH のみが設定されていますが、Web もここで開放しておくように設定します。
FTP は 特に要望がなければ 設定しなくても大丈夫です。最近では FTPS(ファイル転送 SSL) または SFTP(SSH ファイル転送) という 暗号化されたファイル転送を使用する場合が多いです。ファイル転送については次回詳しく行います。
- OSインストール後に設定することもできます。
- このパケットフィルタ機能を使用した場合は、独自のファイアウォール設定を反映できなくなります。
公開鍵の登録
管理者ユーザーの SSH で接続する際に使用する公開鍵を登録できます。
SSH(Secure Shell)とは ネットワークで接続された機器を通信を リモートで操作するための手段 です。 この場合は、手元のパソコンでサーバーを操作するための手段ということになります。
SSH での通信は暗号によって保護されているので通信内容の盗聴を防ぐことができます。この SSH を開始するためには ユーザー認証が必要であり、その方法として パスワード認証 か 公開鍵認証 を使用します。
今回はローカルのパソコンで公開鍵を作成して登録してみたいと思います。
秘密鍵と公開鍵を作成する
秘密鍵の名前はデフォルトでは id_rsa
ですが、新しい名前で作成します。
下記の [ユーザー名]
はユーザーのディレクトリ名が入ります。この例では秘密鍵の名前にxxx_id_rsa
と設定しますが任意の名前で作成してください。
秘密鍵は ルートディレクトリの .ssh
内に作成します。
-
デフォルトの
id_rsa
でもいいのですが、他のサーバーと接続する際に使い回すのも気持ち悪いので新しい秘密鍵を作成しています。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/[ユーザー名]/.ssh/id_rsa): /Users/[ユーザー名]/.ssh/xxx_id_rsa
次にパスワードを入力します。省略することもできるのですが、パスワードを設定します。
ここで設定したパスワードは接続する際に入力する必要があるので忘れないようにしてください。
$ Enter passphrase (empty for no passphrase): [パスワード]
Enter same passphrase again: [パスワードの確認]
これで.ssh
内に xxx_id_rsa
という秘密鍵と xxx_id_rsa.pub
という公開鍵が作成されます。
デフォルトの id_rsa
から名前を変更しているので、ssh-agent
に秘密鍵を登録する必要があります。 xxx_id_rsa
は 先ほどつけた秘密鍵の名前を設定してください。
-
デフォルトの
id_rsa
で生成した場合は登録する必要はありません。
$ ssh-add -K ~/.ssh/xxx_id_rsa
登録されている秘密鍵のリストは次のコマンドで確認することができます。
$ ssh-add -l
公開鍵を登録する
作成された公開鍵 xxx_id_rsa.pub
を開いて、中身をすべてコピーし、管理画面のフォームに貼り付けます。
公開鍵は、ssh-rsa
から始まるテキストです。
-
.pub
ファイルは ターミナルのもしくはテキストエディタで開くことができます。
設定内容を確認する
これですべての情報を設定できたので「設定内容を確認する」ボタンをクリックします。
設定内容の確認のためダイアログが開かれるので、確認できたら「インストールを実行する」ボタンをクリックします。
稼働するまで数分
サーバーが稼働するまで数分だけ待ちます。
インストール中は元の画面に戻りますので、画面左上のサーバーの電源状態が「稼働中」となれば利用することができます。
サーバーにSSHで接続する
SSH で接続する
SSH で接続するには以下のようにターミナルに設定します。
$ ssh root@ホスト名 -p 22
root
は接続するユーザー名で、 -p 22
は ポート番号です。@
右の ホスト名
には VPSサーバーのIPアドレスを指定します。
IPアドレスは ネットワーク情報タブの「アドレス」で確認できます。
接続を試みると、以下のように聞かれることがありますが、「yes」と入力します。
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
以下のように表示されたら接続成功です。
SAKURA Internet [Virtual Private Server SERVICE]
[root@tk-xxx-xxxxx ~]#
これで、一旦 root
ユーザーで 公開鍵認証 を使用したSSH接続は完了です。
ログアウトする
接続を終了するには ログアウト します。ログアウトコマンドを入力して ログアウトを試してみます。
[root@tk-xxx-xxxxx ~]# logout
Connection to .... closed.
OSをアップデートする
最初の確認としてOSを更新します。
もう一度 root
ユーザーでログインしてください。
更新がなければ、No Packages marked for update
と表示されて終わりですが、更新が多い場合は時間が掛かるかもしれません。
[root@tk-xxx-xxxxx ~]# yum update
更新されるパッケージがあれば一覧で表示され、更新するかどうかを問われます。
y
を入力して更新を行います。
Is this ok [y/N]: y
Complete!
と表示されたら更新は終了です。
Dockerのバージョンを確認する
起動スクリプトで入れたDockerのバージョンを確認してみましょう。
[root@tk-xxx-xxxxx ~]# docker -v
Docker version 19.03.13, build 4484c46d9d
Docker が インストールされていることが確認できました。
管理ユーザーのログインを禁止にする
現在、OSインストール時に設定した 管理(root
)ユーザーでログインしています。
公開鍵認証でサーバーにログインしているのですが、実はroot
のパスワード認証でもログインできる状態になっています。
root
権限はサーバー内で最も強い権限を持っているため、外から root
でログインできる状態はセキュリティ上望ましくありません。
そのため、ここでは新しくログイン可能なユーザーを作成します。
もし root
ユーザーを使用する場合は、作成したユーザーでログインした後に root
ユーザーに切り替えます。
新規ユーザーを作成する
ここでは xxx
というユーザーを作成します。
[root@tk-xxx-xxxxx ~]# adduser xxx
パスワードをユーザーに設定します。
[root@tk-xxx-xxxxx ~]# passwd xxx
Changing password for user xxx.
New password: [パスワードを入力]
Retype new password: [確認用パスワードを入力]
passwd: all authentication tokens updated successfully.
これで、xxx
というユーザーが作成できたので、一度ログアウトします。
[root@tk-xxx-xxxxx ~]# logout
Connection to .... closed.
ユーザー名を変更して SSH で接続します。
$ ssh xxx@ホスト名 -p 22
無事に接続できましたか?
確認ができたら一度ログアウトして、もう一度 root
ユーザーで接続します。
ユーザー変更
単にユーザーを変更したい場合であれば、以下のコマンドで変更を行うことができます。ユーザー名を省略した場合はroot
になります。
$ su - [ユーザー名]
作成したユーザーをwheel
グループに追加
wheel
グループはsudo
コマンドでroot
権限で実行することができる特別なグループです。
root
でしか実行できない処理もsudo
コマンドを使用してユーザーが実行できますので、root
権限のためにroot
のパスワードを外部と共有する必要がなくなります。また、sudo
コマンド実行時には常にログが残るようになるので、セキュリティ面などの強化を図ることができます。
usermod
コマンドでユーザーxxx
をwheel
グループに追加します。
[root@tk-xxx-xxxxx ~]# usermod -G wheel xxx
新規ユーザーの公開鍵を設定
root
の公開鍵を 新規ユーザーにコピーする
現段階ではxxx
ユーザーの SSH は パスワード認証 を使用しているので、公開鍵認証 を使用してログインするように設定する必要があります。
root
ユーザーのホームディレクトリである /root
に .ssh
ディレクトリがあり、その中に OSインストール 時に登録した公開鍵があります。
新規ユーザー(ここでは xxx
)のホームディレクトリは /home/xxx
ですが、そこに .ssh
ディレクトリは存在しません。
なので、最初に .ssh
ディレクトリを作成します。
[root@tk-xxx-xxxxx ~]# mkdir /home/xxx/.ssh
次に、/root/.ssh/authorized_keys
の内容(公開鍵)を /home/xxx/.ssh/authorized_keys
に追加します。
[root@tk-xxx-xxxxx ~]# cat ~/.ssh/authorized_keys >> /home/xxx/.ssh/authorized_keys
次のコマンドで 内容が追加できているかどうかを確認します。
ssh-rsa
から始まる公開鍵が表示されたら成功です。
[root@tk-xxx-xxxxx ~]# cat /home/xxx/.ssh/authorized_keys
ディレクトリおよびファイルの所有者を新規ユーザーに変更する
root
ユーザーで .ssh
ディレクトリを作成したため、ディレクトリの所有者およびグループは root
となっています。
[root@tk-xxx-xxxxx ~]# ls -l /home/xxx/.ssh/
total 4
-rw-r--r-- 1 root root 576 Oct 16 18:57 authorized_keys
以下のコマンドで、.ssh
ディレクトリ以下すべてのディレクトリとファイルの所有者と所有グループを xxx
ユーザーに変更します。
[root@tk-xxx-xxxxx ~]# chown -hR xxx:xxx /home/xxx/.ssh
所有者が変更できたらログアウトします。
ディレクトリとファイルに権限を付与
xxx
ユーザーでログインします。パスワードを入力せずにログインできれば 公開鍵認証 でのアクセスが成功しています。
ユーザーのホームディレクトリにある .ssh
ディレクトリに、「読み込み」「書き込み」「実行」の権限を新規ユーザーのみに与えるように設定します。
[xxx@tk-xxx-xxxxx ~]$ chmod 700 ~/.ssh/
つづいて、authorized_keys
ファイルに 「読み込み」「書き込み」の権限を新規ユーザーのみに与えるように設定します。
[xxx@tk-xxx-xxxxx ~]$ chmod 600 ~/.ssh/authorized_keys
root
からの SSH 接続を不可にする
root
アカウントでログインします。
ここでは /etc/ssh/sshd_config
ファイルを編集します。
編集時にファイルが壊れてしまっても大丈夫なのように、念の為ファイルをコピーしておきましょう。
[root@tk-xxx-xxxxx ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old
Linuxの標準テキストエディタである vi を使用してファイルを編集します。
[root@tk-xxx-xxxxx ~]# vi /etc/ssh/sshd_config
PermitRootLogin yes
となっている行を編集し、以下のようにします。
PermitRootLogin no
PasswordAuthentication no yes
となっている行を編集し、以下のようにします。
PasswordAuthentication no
ファイルを保存したら、再起動します。
[root@tk-xxx-xxxxx ~]# systemctl restart sshd.service
ここまで完了したら、一度ログアウトして 再度 root
アカウントでログインを試してみます。
ログインできなければ完了です。
Dockerコマンドを新規ユーザーで使用する
新規ユーザーではdocker
コマンドを実行した際に権限エラー(permission denied
)が発生することがあります(docker volume create
など)。
これを回避するために、新規ユーザーをグループdocker
に所属させます。
[xxx@tk-xxx-xxxxx ~]$ sudo gpasswd -a $USER docker
これで一度ログアウトし、再度ログインすればOKです。
SSHのポート番号を変更する
SSHは22番ポートが使用されるということは一般的に知られています。
そのため、22番ポートを使用した不正アクセスの危険性に常に晒されています。
このポート番号を他の番号に変更することで、少しでも不正アクセスのリスクを下げることがこの章の目論見です。
sshd_config
のPort
を編集
ssh
の設定ファイル(sshd_config
)に設定されているポート番号を変更する番号(1024~65535の任意の番号)に編集します。
[root@tk-xxx-xxxxx ~]# vi /etc/ssh/sshd_config
この例では22000
にポート番号を変更します。
次の箇所を探して、変更してください。
#Port 22
Port 22000
変更後はsshd
を再起動し、設定を反映します。
[root@tk-xxx-xxxxx ~]# systemctl restart sshd
次にサーバー内部からサーバーのポートにアクセスし、ポートが正常に開いていることを確認します。
[root@tk-xxx-xxxxx ~]# ssh root@localhost -p 22000
The authenticity of host '[localhost]:1234 ([127.0.0.1]:1234)' can't be established.
ECDSA key fingerprint is SHA256:5ixFHn7DjBM3MRT9G+XPVAONR5jeYpT2AtzNh8XYRk8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:1234' (ECDSA) to the list of known hosts.
root@localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
root
でログインできないのでエラーのように見えるかもしれませんが、これで正常です。
もしポートが開いていなければ次のようなエラーが出ます。
[root@tk-xxx-xxxxx ~]# ssh root@localhost -p 22000
ssh: connect to host localhost port 22000: Cannot assign requested address
firewalld
の設定ファイルを編集
次にファイアウォールの設定を行います。ファイアウォールは外部からのアクセスを制御するための防御壁のようなものです。
このファイアウォールに、22000
ポートを公開するように設定します。
[xxx@tk-xxx-xxxxx ~]$ sudo vi /usr/lib/firewalld/services/ssh.xml
ssh
のファイアウォール用の設定ファイルを編集します。
中身は次のようになっているので、22
を22000
に編集してください。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing cc
ommands on remote machines. It provides secure encrypted communications. If you
plan on accessing your machine remotely via SSH over a firewalled interface, enaa
ble this option. You need the openssh-server package installed for this option tt
o be useful.</description>
<port protocol="tcp" port="22"/>
</service>
次のように編集します。
<port protocol="tcp" port="22000"/>
編集後はファイアウォールをリロードし、設定を反映させる必要があります。
ファイアウォールの稼働状況を確認します。
[xxx@tk-xxx-xxxxx ~]$ sudo firewall-cmd --state
running
running
となっているので、再起動します。
[xxx@tk-xxx-xxxxx ~]$ sudo firewall-cmd --reload
success
ファイアウォールが起動していなければ、次のコマンドで起動できます。
[xxx@tk-xxx-xxxxx ~]$ sudo systemctl start firewalld
これで設定後のポート番号でアクセスできれば完了です。
$ ssh xxx@ホスト名 -p 22000
- さくらVPSのパケットフィルタが有効になっている場合はアクセスできません。パケットフィルタを無効にする必要があります。
さくらVPSのパケットフィルタを無効にするためにはダッシュボードで次のように操作してください。
firewalld
の自動起動設定
ファイアウォールをサーバーの再起動時などに自動起動させることができます。
まずは現在の設定状況を確認します。
[xxx@tk-xxx-xxxxx ~]$ systemctl is-enabled firewalld
disabled
enabled
となっていれば設定済みです。
今回はdisabled
なので設定を行います。
[xxx@tk-xxx-xxxxx ~]$ sudo systemctl enable firewalld
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
もう一度次のコマンドを実行してenabled
となっていれば完了です。
[xxx@tk-xxx-xxxxx ~]$ systemctl is-enabled firewalld
enabled
Dockerデーモンの再起動
ファイアウォールを起動または再起動した場合に、Docker Composeをビルドしようとすると次のようなエラーが発生することがあります。
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-59606917cb2c -j RETURN: iptables: No chain/target/match by that name.
これはファイアウォールが起動または再起動した際にiptables
のDockerチェーンが削除されてしまうため発生します。
これを回避するためにファイアウォール起動後にDockerデーモンを再起動します。
[xxx@tk-xxx-xxxxx ~]$ sudo systemctl restart docker
SSH config
ファイルを作成する
$ ssh xxx@ホスト名 -p 22000
とすることでログインすることができますが、ログインごとにこのコマンドを使用するのは面倒です。
ローカルの ~/.ssh
に config
ファイルを作成して、ログインを簡略化できます。
すでに config
ファイルがある場合はファイル内に追加します。
config
# xxx VPS
Host [接続に使用するホスト名]
HostName [IPアドレス]
User [ユーザー名]
PreferredAuthentications publickey
IdentityFile [秘密鍵の場所]
Port 22
UseKeychain yes
AddKeysToAgent yes
今回は以下のようになります。
config
# xxx VPS
Host test
HostName 160.x.x.1
User xxx
PreferredAuthentications publickey
IdentityFile /Users/rakuma/.ssh/xxx_id_rsa
Port 22
UseKeychain yes
AddKeysToAgent yes
このファイルを作成後に、以下のコマンドでログインができるかどうかを実行します。
$ ssh test
xxx
ユーザーでログインできていれば完了です。