さくらのVPSを借りて CentOS8 x86_64 をインストールします。

今回 DockerCompose を使用したいので、さくらのVPSの起動スクリプトを使用してインストールします。簡単で便利です。

また、新規ユーザーを作成して 公開鍵認証 を使用したログインができるところまで今回は進めていきます。

今回は、さくらのVPS を使いました。契約したプランは以下のとおりです。

二週間の無料期間がありましたが、すぐに本契約したので無料期間中の制限はありません。

ゾーンは 東京第2ゾーン です。

プラン CPU メモリ 標準容量(SSD) 月額料金/年額料金
1GB 仮想2Core 1GB 50GB 900円/9,900円

OSインストール

まずは、OS をインストールするために右上の「各種設定」ボタンから OSインストール をクリックします。

右上の「各種設定」ボタンをクリックして表示されるメニュー

OSインストール形式の選択

OSをインストールする形式を選択します。今回は「標準OS」を選択します。

OSをインストールする形式を選ぶ

標準OSインストール

インストールするOSを選択します。

さくらVPS は デフォルトで CentOS が使用されているので、今回は現時点(2020/10)で一番新しい CentOS8 x86_64 を選択します。

管理者ユーザ(root)のパスワードを設定する必要があるので、パスワード生成ツール最強 を指定して作成したパスワードを設定します。

  • root パスワードは推測されやすいパスワードを設定するべきではありません。
インストールするOSを選択してrootパスワードを設定する

スタートアップスクリプト

サーバーセットアップ後の初回起動時に自動で実行してくれるスクリプトを設定できます。CentOS 7 で使用できた スクリプトも徐々に CentOS 8 で使用できるようになっていっているみたいです。

今回は Docker を使用したいので、さくらの公式スクリプト「DockerCompose」を選択しています。

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 から始まるテキストです。

Add public key(公開鍵を登録する)
  • .pub ファイルは ターミナルのもしくはテキストエディタで開くことができます。

設定内容を確認する

これですべての情報を設定できたので「設定内容を確認する」ボタンをクリックします。

Confirm button of Install OS for Sakura VPS(設定内容を確認するボタン)

設定内容の確認のためダイアログが開かれるので、確認できたら「インストールを実行する」ボタンをクリックします。

Confirm dialog of install OS for Sakura VPS(確認ダイアログ)

稼働するまで数分

サーバーが稼働するまで数分だけ待ちます。

インストール中は元の画面に戻りますので、画面左上のサーバーの電源状態が「稼働中」となれば利用することができます。

Status of Server(サーバーの状態)

サーバーにSSHで接続する

SSH で接続する

SSH で接続するには以下のようにターミナルに設定します。


$ ssh root@ホスト名 -p 22
    

root は接続するユーザー名で、  -p 22 は ポート番号です。@ 右の ホスト名には VPSサーバーのIPアドレスを指定します。

IPアドレスは ネットワーク情報タブの「アドレス」で確認できます。

IP Address of Sakura VPS(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コマンドでユーザーxxxwheelグループに追加します。


[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_configPortを編集

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のファイアウォール用の設定ファイルを編集します。
中身は次のようになっているので、2222000に編集してください。


<?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のパケットフィルタを無効にするためにはダッシュボードで次のように操作してください。

さくら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
    

とすることでログインすることができますが、ログインごとにこのコマンドを使用するのは面倒です。

ローカルの ~/.sshconfig ファイルを作成して、ログインを簡略化できます。

すでに 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 ユーザーでログインできていれば完了です。