まえがき
この記事について
この記事は、ConoHa VPS でSSH接続の初期設定を行った際のメモです。
きっかけ
外出先でふと時間が空いて何か開発しようと持ったとき、手持ちのMacbookAirのスペックが、家に置いてあるMac miniよりも低くて、動作が重いのが課題でした。
レンタルサーバーを借りてそこで開発すれば、PCのスペックによらず、家でも外出先でも同じ環境で開発ができて便利だと思い、設定をしてみました。
VPSサーバーを作成する
ConoHaへのアカウント作成は済んでいるものとします。
ログインするとこのような画面になっているはずです。
左のタブから「サーバー追加」を選択します。
サーバー追加画面はこのようになっています。
右側にある月額の合計金額が、選択した項目に応じて変化します。
今回、以下の設定で作成しました。
サービス:VPS
イメージタイプ:OS (CentOS)
料金タイプ:1ヶ月
プラン:2GB
rootパスワード:こちらは任意の値を入力します。root権限でSSH接続する際のパスワードとして使用します。
ネームタグ:用途に応じて好みの名前をつけます。後で変更も可能です。
rootパスワードは忘れるとSSH接続できなくなるので、必ずどこかにメモしておきます
料金を確認して、問題なければ「次へ」を押します。
お支払い画面に遷移します。
支払い方法を選択して、「決済」を押します。
しばらく待つと、サーバーが立ち上がります。ステータスが「起動中」になっていればOKです。
初期設定を行う
あとはSSH接続して開発していけばいいのですが、
やっておいた方がいい初期設定があるので実施しておきます。
ログイン
まずはログインします。
先ほどのサーバーリストのページのネームタグをクリックすると、サーバーの詳細ページに入れます
「コンソール」ボタンがあるので、これをクリックするとコンソールが開きます。
コンソール画面の「コンソール」タブから「シリアル」を選択すると、見た目がちょっと良くなります。
この画面で以下を入力することで、root権限でサーバーに接続できます。
login:root
Password:サーバー作成時に指定したrootパスワードの値
vm-bae22ffe-00 login: root
Password:
Last login: Tue Dec 17 23:30:00 on tty1
[root@vm-bae22ffe-00 ~]#
なお、ターミナルを閉じる前にはlogoutコマンドでログアウトしてから閉じるようにします。
パッケージのアップデート
パッケージをアップデートし、最新の状態にします。
結構時間がかかるので、気長に待ちます。
# sudo yum update -y
もう一度同じコマンドを実行して、以下のように Complete! が表示されればアップデートが完了しています。
> Last metadata expiration check: 0:12:56 ago on Wed 17 Jul 2024 08:29:32 AM JST.
> Dependencies resolved.
> Nothing to do.
> Complete!
ユーザー作成
rootユーザーを常用すると権限が強すぎて危険なので、別のユーザーを作成し、そちらを使用することにします。
ユーザー名はadminにしましたが、なんでも大丈夫です。
# adduser admin
パスワードを設定します。
# passwd admin
> Changing password for user admin.
> New password:
> Retype new password:
> passwd: all authentication tokens updated successfully.
設定したパスワードは忘れないようにメモしておいてください。
作成したユーザーでログインできるか確認するため、rootユーザーは一旦ログアウトします。
# logout
>
> CentOS Stream 9
> Kernel 5.14.0-354.el9.x86_64 on an x86_64
adminユーザーでログインできることを確認します。
# login: admin
> Password:
> $
ユーザーにsudo権限をつける
作成したadminユーザーにsudo権限をつけます。
adminユーザーでログインしている場合、ログアウトして、rootユーザーで再度ログインします。
adminユーザーの場合はログアウトします
$ logout
rootユーザーで再ログイン
vm-0bd3dadf-5b login: root
Password:
Last login: Wed Jul 17 07:48:05 on ttyS0
以下のコマンドで、adminユーザーをwheelグループに追加します。
-aオプションがない場合、wheelグループに追加ではなく上書きになってしまうので注意してください。
# usermod -aG wheel admin
再度、adminユーザーでログインして、sudoが使用できるか確認します。
パスワード入力が求められるので、adminユーザーのパスワードを入力します。
$ su - admin
Password
試しにsudoでvimのバージョンを確認してみます。
$ sudo vi -v
パスワードを入力したあと、vimのバージョンが確認できればOKです。
rootユーザーでSSH接続できないようにする
rootユーザーで不正アクセスされると、システムを一発で乗っ取られてしまうため、
rootユーザーでのログインを禁止しておきます。
sshd_configファイルを開き、PermitRootLoginをnoにします。
$ sudo vim /etc/ssh/sshd_config
noに変更
#PermitRootLogin prohibit-password
PermitRootLogin no
サーバーをリスタートします。
$ sudo systemctl restart sshd
一度logoutして、rootでログインできなくなっていればOKです。
rootでログインできちゃうんだけど??っていう方は、
もし、rootユーザーによるSSH接続や、パスワードによるSSH接続ができてしまう場合に確認すること
の章を確認してみてください。
SSH接続するポート番号を変更する
セキュリティ強化のため、SSH接続するポート番号をデフォルト値の22から別の値に変えます。
sshd_configファイルを開きます
$ sudo vim /etc/ssh/sshd_config
番号を変更します
#Port 22
Port 10022
リスタートします
sudo systemctl restart sshd
公開鍵認証方式でログインする
今まではパスワードによってログインしていましたが、
セキュリティ強化のため、公開鍵認証方式でのログインに変更します。
VPSサーバー側で公開鍵認証方式を有効にする
まず、VPSサーバー側で公開鍵認証方式を有効にします
sshd_configを開きます
sudo vim /etc/ssh/sshd_config
コメントアウトされている以下の一文を有効にします
PubkeyAuthentication yes
リスタートで設定を反映します
sudo systemctl restart sshd
セキュリティグループの設定
変更したポート番号で公開鍵認証方式でのアクセスを許可するため、セキュリティグループの設定を行います。
まず、ConoHaのコントロールパネルで、セキュリティ>セキュリティグループ のページを開きます。
ページの右上に「+セキュリティグループ」ボタンがあるのでクリックします。
セキュリティグループ名、および説明を記入し、「保存」ボタンを押します。
保存すると、下のセキュリティグループの一覧に保存したものが追加されるので、以下のように設定します。
通信方向 | イーサタイプ | プロトコル | ポート範囲 | IP/CIDR |
---|---|---|---|---|
Out | IPv6 | ALL | ||
Out | IPv4 | ALL | ||
In | IPv4 | TCP | 10022 | 0.0.0.0/0 |
In | IPv6 | TCP | 10022 | ::/0 |
サーバーの詳細画面に戻り、作成したセキュリティグループを追加します。
SSHキーの設定
SSHキーを作成する
セキュリティ>SSH Keyページの「追加」ボタンから適当な名前で作成します。
追加する際、プライベートキー(秘密鍵)がPCにダウンロードされます。
パプリックキー(公開鍵)はこのページで確認できます。
次の手順でパブリックキーをサーバーに設定するため、値をどこかにコピーしておきます。
パプリックキーをVPSサーバーに設定する
VPSサーバーに入り、.sshディレクトリを作成します。
// ディレクトリを移動
$ cd /home/admin
// .sshディレクトリを作成
$ mkdir .ssh
.sshディレクトリにauthorized_keysファイルを作成します。
$ cd .ssh
$ vi authorized_keys
authorized_keysファイルに、先ほどコピーしておいたパブリックキーを貼り付け、保存して閉じます。
また、権限を変更しておきます。
※以下のコマンドは.sshディレクト内で実施する前提になっています。
$ sudo chmod 700 ./authorized_keys
シークレットキーを自分のPCの.sshディレクトリに移動する
SSH Keyを作成した際にダウンロードされたシークレットキーは自分のPCの.sshディレクトリに移動しておきます。
(もし、.sshディレクトリが存在しない場合は作成してから移動します)
Downloadsディレクトリにダウンロードされたシークレットキーを、.sshディレクトリに移動するコマンドの例
※自身のPCのディレクトリ構成に合わせて変更してください
$ mv /Users/<ユーザー名>/Downloads/<作成したキーの名前>.pem /Users/<ユーザー名>/.ssh/<作成したキーの名前>.pem
また、シークレットキーの権限を変更しておきます。
$ cd /Users/<ユーザー名>/.ssh
$ sudo chmod 600 ./<作成したキーの名前>.pem
ファイアウォールの設定
VPSサーバーにログインしてファイアウォールの設定を変更し、22番ポートを未許可にするとともに、10022番ポートを許可します。
ファイアウォールが起動していることの確認
$ sudo firewall-cmd --state
running
設定の確認
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
servicesの欄にsshとあるため、ポート22が解放されています。
なのでまずこれを閉じます。
sshを許可対象から除外します
$ sudo firewall-cmd --permanent --remove-service=ssh
success
ファイアウォールの設定を反映します
$ sudo firewall-cmd --reload
success
設定を再度表示し、servicesの欄にsshが消えたことを確認します
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
次に、ポート10022を開放します
$ sudo firewall-cmd --zone=public --add-port=10022/tcp --permanent
success
ファイアウォールの設定を反映します
$ sudo firewall-cmd --reload
success
設定を再度表示し、portsの欄に10022/tcpが追記されたことを確認します。
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client
ports: 10022/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
sshd_config ファイルを編集
以下コマンドでsshd_configファイルを開きます。
sudo vim /etc/ssh/sshd_config
Portの設定がコメントアウトされているはずなので、10022に設定をしておきます。
#Port 22
Port 10022
設定に誤りがないか確認
sudo sshd -t
SSHサービスの再起動を行い、設定を反映させます。
sudo systemctl restart sshd
公開鍵認証方式によるSSH接続を試す
以上の設定で、公開鍵認証方式によるSSH接続ができるようになっているはずです。
PCのターミナルからSSH接続できることを確認します。
$ ssh -i ./<ダウンロードした秘密鍵> <ユーザー名>@<VPSサーバーのアドレス> -p <ポート番号>
例
$ ssh -i ./key-for-ssh.pem admin@111.111.111.11 -p 10022
以下のように、接続しますか?と聞かれるので、yesと打つと接続できます
Are you sure you want to continue connecting (yes/no/[fingerprint])?
パスワードによるログインを禁止する
公開鍵認証方式によるログインができるようになったら、セキュリティ強化のためにパスワードによるログインは禁止しておきます。
VPNサーバーにアクセスして、sshd_configファイルを開きます。
$ sudo vim /etc/ssh/sshd_config
PasswordAuthenticationの設定をnoに変更して保存します。
# PasswordAuthentication yes
PasswordAuthentication no
SSHサービスの再起動を行い、設定を反映させます。
$ sudo systemctl restart sshd
ここまで設定したら、以下について確認するのがおすすめです。
- rootユーザーでSSH接続できないこと
- adminユーザー(自分の作成したユーザー)でSSH接続できること
- パスワードによるSSH接続はできないこと
- 許可していないユーザーでSSH接続できないこと
- ポート番号22でSSH接続できないこと
- ポート番号10022(自分の設定した値)でSSH接続できること
もし、rootユーザーによるSSH接続や、パスワードによるSSH接続ができてしまう場合に確認すること
VPSサーバーに入り、sshdの設定を確認します。
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication'
期待値
rootログインおよびパスワードによるログインが禁止されている
permitrootlogin no
passwordauthentication no
もしこの結果の両方もしくは片方がyesになっている場合、
sshdの設定ファイル内で別のファイルがIncludeされており、
そのIncludeされているファイルの設定が反映されている可能性があります。
以下のコマンドで、別のファイルが存在しないか確認します。
$ sudo ls -l /etc/ssh/sshd_config.d/
出力例
$ sudo ls -l /etc/ssh/sshd_config.d/
total 12
-rw-r--r--. 1 root root 141 Nov 12 2021 01-permitrootlogin.conf
-rw------- 1 root root 27 Dec 18 11:45 50-cloud-init.conf
-rw------- 1 root root 719 Oct 21 21:30 50-redhat.conf
このようにファイルがヒットしたら、各ファイルの中身を確認していきます。
sudo cat /etc/ssh/sshd_config.d/01-permitrootlogin.conf
sudo cat /etc/ssh/sshd_config.d/50-cloud-init.conf
sudo cat /etc/ssh/sshd_config.d/50-redhat.conf
ファイルの中にもし以下の設定があれば、noに書き換えます
(rootログインを許可する設定と、パスワードによるログインを許可する設定です)
permitrootlogin yes
passwordauthentication yes
最後に、sshdを再起動して設定を反映させます。
$ sudo systemctl restart sshd
再度、sshdの設定を確認し、値がnoになっていることを確認します。
$ sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication'
期待値
permitrootlogin no
passwordauthentication no
SSH設定ファイルに接続情報を追加する
SSH設定ファイルに接続情報を記載すると、SSH接続する際にコマンドの入力を省略することができます。
この設定は、後段のVSCodeでSSH接続をする際にも使用します。
手元のPCでターミナルを開いて、SSH設定ファイルを編集します。
(ファイルがなければ作成してください)
$ vi ~/.ssh/config
以下を追加します。
サーバー名は、自分のわかりやすいものをつければ大丈夫です。
Host <サーバー名>
HostName <VPSのアドレス>
User <ユーザー名>
IdentityFile <秘密鍵のパス>
Port <ポート番号>
例
Host ConoHaDev
HostName 111.111.111.11
User admin
IdentityFile ~/.ssh/key-for-ssh.pem
Port 10022
これで、PCのターミナルから、追加したホスト名を打つだけでssh接続ができるようになります。
$ ssh ConoHaDev
おまけ:VSCodeでConoha VPSへSSH接続する
私はVSCodeを使って開発を行っているため、
VSCodeからSSH接続できると便利なのでやり方をメモしておきます。
拡張機能のRemote - SSH
をインストールします。
ダウンロードすると、左下の角に、><みたいな形の青いボタンが追加されます
それをクリックすると、「ホストに接続する...」という選択肢が出てくるのでクリックします
すると、VSCodeから ConoHaのサーバーにSSH接続することができます
「フォルダーを開く」ボタンをクリックすると、開くフォルダーを選択でき、フォルダーの中身も確認することができます
あとは、自分の好きなように開発環境を構築すればOKです
あとがき
元々は外出先で開発環境に困っていたのがきっかけでしたが、サーバーの設定をするだけでも色々勉強になりました。
本記事ではVSCodeでSSH接続するところまででしたが、その後の環境構築についてもチャレンジしてみたいと思います。