Ubuntu Serverで安全にSSHする!
初めてLinuxサーバを立ち上げる際、VPSサービスなどを契約してリモートで使う方が多いと思いますが、インターネットを介してリモートで扱うには初期状態だとセキュリティ上の懸念があります。
この記事では、Linuxを触り始めたよ~という方向けに、ConoHaを例にセキュアにサーバを使うための8つの初期設定について紹介します。
他のVPSサービスやOSでもやることは基本的に同じです。
違うOSの場合、コマンドは異なる場合があります。
この記事でやること
ゴール:UbuntuでSSHとファイアウォール(FW)の設定をして、安全にサーバを使い始める。
使用OS:Ubuntu Server 22.04.1 LTS
使用サービス:ConoHa VPS
使用ソフト:VS-Code
- 作業用に新しいユーザを作り、管理者権限でコマンドが実行できるようにする
- ファイアウォールを設定してリモートからアクセスできるようにする
- SSHサーバのパスワード認証をやめ、公開鍵認証方式による認証ができるようにする
VPSでサーバを立ち上げたところからスタートします。
コンソールに入る
まずはコマンドを実行するコンソール(いわゆる黒い画面、CLI)に入ってみましょう。
初期状態では外部からリモートでアクセスできないため、VPSのコントロールパネル上から直接アクセスします。
ConoHaの場合、サーバリストからサーバを選択して詳細画面に入り、「コンソール」というボタンを押すとアクセスできます。
別窓でコンソールが開くと
サーバ名 login:
という画面が表示されますので、“root”と入力し、パスワードを求められたらサーバ作成時に入力したパスワードを入力します。
サーバ名 login: root
Password: パスワード
パスワードを入力する際、入力しても文字は表示されませんがきちんと入力できています。
表示されないとうまく入力できない!という方は、上にある「テキスト送信」を押すとテキストボックスが表示されますので、そこにコピペして送信するとよいです。
“Welcome to Ubuntu バージョン名”と表示され、コマンド待機画面になったらOKです。
ユーザ名を入れ間違えたら、Ctrl + C でやり直せます。
作業用ユーザの作成とsudoグループへの追加
さて、さきほどrootというユーザでログインしましたが、こちらはありとあらゆる能力を持つ神様アカウント(スーパーユーザー)なので、普段使いするのはセキュリティ上よろしくありません(最小特権の原則)。
そこで、普段使い用に一般ユーザを作成し、必要に応じて権限を借りながらサーバをいじっていきます。
作業用ユーザの作成
Ubuntuでユーザを作成するには、“adduser ユーザ名”コマンドを使用します。
adduserはユーザ用ホームディレクトリ(/home/ユーザ名)の作成もしてくれるので便利です。
adduser sumomomomomomomomo
user用のパスワードも入力を求められるので入力します。
ここでのパスワードはそこそこ複雑で長いものがおすすめです。
普段使いではsudoでコマンドを実行する時たまに求められるぐらいで、頻度が高くないからです。
sudoグループへの追加
作業用ユーザができましたが、これは一般ユーザのため、設定ファイルの編集などができません。
そのため、今作ったユーザをsudoグループに入れて、管理者権限を一時的に借りてコマンドが実行できるようにします。
・sudoとは?:rootの権限を借りてコマンドを実行するためのコマンドです。Windowsにおいて、一般ユーザでもソフトウェアを「管理者として実行」できるのと同じイメージです。
・グループとは?:ユーザの権限設定をまとめてできるようにするための仕組みです。例えば「ユーザ」というグループにはデータの読み込みのみ許可して一般従業員らを属させ、「管理者」というグループにはデータの読み書きを許可して情シス部門担当者らを属させる、というような使い方をします。
ユーザをsudoグループに追加するには、“gpasswd -a ユーザ名 sudo”コマンドを実行します。
gpasswd -a sumomomomomomomomo sudo
今作ったユーザであれやこれやできるようになりました。
作業用ユーザでのログイン
以降の作業は、今作った作業用ユーザで実施します。
現在ログインしているrootユーザから“exit”コマンドでログアウトすると、最初のログイン画面に戻るのでユーザ名とパスワードを入れてログインします。
ログイン後、コマンド入力欄の表示が“ユーザ名@サーバ名:~$”になっていればOKです。
sumomomomomomomomo@myserver:~$
SSHの設定
作業用ユーザができましたので、続いてリモートでコマンドを実行できるSSHを設定していきます。
ここでは、まずパスワード認証でログインし、公開鍵認証方式でログインできるように設定します。
SSHとは?:リモートから安全にコマンドラインを使うためのサービス。HTTPSと同じような仕組みで通信内容を暗号化するため、安全にやりとりできます。また、これを応用してファイルのやりとりなども可能です。
sshd_configファイルの編集
まずはsshd_configファイルを編集してSSHサービスの設定をしていきます。
エディタで“/etc/ssh/sshd_config”ファイルを開きます。
sudo vi /etc/ssh/sshd_config
以下の内容を修正・追記していきます。
#以下2つの内容の行を探し、yesに修正(コメントアウトがついていたら外す)
PermitRootLogin yes
PubkeyAuthentication yes
#以下の内容を追記する(場所はご自身のわかりやすいところで)
Port 1234
Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
KexAlgorithms curve25519-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-512
PubkeyAcceptedKeyTypes ssh-ed25519
ChallengeResponseAuthentication no
各項目の説明
PermitRootLogin | rootユーザでのログインは不要なので無効にします。 |
PubkeyAuthentication | 公開鍵認証方式を有効にします。 |
Port | ポート番号を指定します。初期設定の22番はよく狙われるので、1024-49151のうち好きな番号を指定して使うとよいです(ユーザーポート)。 |
Ciphers | 通信内容の暗号化方式を指定します。ここでは安全性の高いAES256-GCMとCHACHA20-POLY1305方式を指定しています。 |
KexAlgorithms | 暗号化に必要な共通鍵の交換方法を指定します。ここでは安全性の高いCurve25519-256(ECDH)を指定しています。 |
MACs | 内容が改ざんされていないかの確認(メッセージ認証)方式を指定します。ここでは安全性の高いhmac-sha2-512を指定しています。 |
PubkeyAcceptedKeyTypes | 公開鍵認証でクライアントの認証に使う鍵の種類を指定します。ここでは安全性の高いed25519を指定しています。 |
ChallengeResponseAuthentication | チャレンジレスポンス認証は不要なので無効にします。 |
🐴パルシャちゃんのセキュアポイント🐴
安全な方法を指定しよう!
ユーザ認証や暗号化などの方法を設定する”Ciphers・KexAlgorithms・MACs・PubkeyAcceptedKeyTypes”の4項目に安全な方法を指定しましょう。これら安全性に関わる処理でノンセキュアな方法の使用を禁止し、セキュリティの向上が見込めます。上記の例では、現時点で安全性が高く負荷も比較的軽い方法を指定しています。
尚、Ciphers・Kex・MACsに指定可能な方法は各自の環境によって異なるため、以下のコマンドで一度確認してみることをおすすめします。
Ciphers | ssh -Q cipher | 暗号化スイート |
Kex | ssh -Q kex | 鍵交換アルゴリズム |
MACs | ssh -Q mac | メッセージ認証方式 |
また、手元の端末で使うクライアントソフト側が対応しておらず、エラーが出ることがあります(例えばこの設定だとTeraTermは対応していないようです)。ソフトを変えたくない場合、該当行をコメントアウトしてください(自動的に最善の方式を使うので、セキュリティは下がります)。
編集できたら、“systemctl restart サービス名”コマンドでSSHサービスを再起動します。
エラーが出る場合は、設定ファイルにタイプミスがないか確認してみてください。
sudo systemctl restart sshd
SSHに限らず、なにかサービスの設定変えたときはリスタートが必要です!!
忘れて数時間無駄にすることがしばしばあるのでご注意。
ファイアウォールの設定
ここまででSSHの設定ができましたが、このままではまだSSHさんと通信ができません。サーバの入り口で入ってくる通信の検問的なことをやっているファイアウォール(FW)さんが通信を拒否してしまうからです。
続いて、FWに通信を許可するよう設定します。
Ubuntuでは、UFWという便利なFWがあるのでこれを使います。コマンドの実行には管理者権限が必要です。
まず“ufw enable”でUFWを有効にし、(既に有効になっているかもしれない)“ufw default deny”でデフォルトの受入設定をdenyにして、ブラックリスト形式の設定ができるようにします。
#UFWを有効にする
sudo ufw enable
#入ってくる通信(incoming)のデフォルトをdeny(拒否)にして、ブラックリスト形式で設定できるようにする
ufw default deny
有効にしたら、“ufw status”で現在の設定を確認します。
更地のままならそのままで、設定が存在する場合は“ufw status numbered”→“ufw delete 番号”で全て削除します。
これで一度入ってくる通信を全て拒否するようになりました。
#現在の設定を確認
sudo ufw status
#設定が存在する場合、numberedで各設定の番号を確認してdeleteで削除する
sudo ufw numbered
sudo ufw delete 1
次は、SSHへの通信を許可するように設定します。
通信の許可は、“ufw allow to any port ポート番号”で設定できます。ポート番号には、sshd_configファイルで設定した番号を指定します(特に指定してなければ、初期の22番です)。
追加したら、”ufw reload”でFWの設定を再読み込みします。
#ポートへの通信を許可する
sudo ufw allow to any port 1234
#FWの設定をリロードする(忘れずに!)
sudo ufw reload
これで晴れて、SSHさんへ通信が届くようになりました。
リロード毎回忘れずに!
忘れて数時間無駄にすることがしばしばあるのでご注意(2回目)。
VS-Codeでサーバへのリモートアクセスを試す
ここでSSHを使ったリモートアクセスができるようになったので、試してみます。
ここまでConoHaのコンソール機能を使って直接コマンドを実行してきましたが、“exit”でログアウトし閉じて構いません。
SSHクライアントソフトにはVS-Codeを使います。
VS-CodeにSSHの拡張機能を入れる
VS-Codeの拡張機能Marketplaceで”Remote Development”(MS提供)をインストールします。
ついで、左の「リモートエクスプローラー」を開き、「SSH」のところにマウスを合わせると出てくる歯車マークから構成ファイル(初期設定:C:\Users\ユーザ名\.ssh\config)を開き、以下の書式に従ってサーバ設定を追記します。
Host 表示名(VS-Code上の)
HostName IPアドレス or hostname
Port ポート番号
User さっき作った作業ユーザのユーザ名
「リモート」のところにある更新マークを押してリロードしたら、サーバ名のところの接続マークを押して接続します。
初回はOSの選択(Linuxを選択)と「接続しますか?」(フィンガープリントの確認)と聞かれるので、はいを押します。パスワードを聞かれたら作業ユーザのパスワードを入力し接続します。
コマンドラインに入れたら接続OKです。やったにゃ🐴
VSのconfigファイルを色々いじってると、サーバに接続できなくなることがあります。
この場合、configファイルと同じディレクトリの“known_hosts”ファイルを消すとうまくいくかも。
公開鍵認証方式でログインできるようにする
最後に、SSHのログインを公開鍵認証方式でできるようにします。
公開鍵認証方式は、秘密の鍵を提示することによって正規のユーザであることを確認する方式です。
パスワードを使った認証と比べ安全性が高い上、個人で管理する分には利便性も高まります。
公開鍵認証とパスワード認証:パスワード認証は門番に合言葉を言うことで本人しか入れないようにする方式、公開鍵認証方式はドアに鍵をつけて本人しか入れないようにする方式というイメージです。毎度合言葉を述べるよりも鍵を提示した方が楽なので個人で使う分には便利ですが、組織内で使う場合はユーザに鍵を説明するのが大変&消されてしまうことがあり、担当者が大変だという話をよく聞きます。
キーペアを用意する
サーバに置いておく公開鍵と、手元に置いておく秘密鍵を用意します。
ここではサーバ側でキーペアを作成して秘密鍵をダウンロードします。
キーペアの作成は“ssh-keygen -t 鍵の種類”で行います。鍵の種類は安全性が高く軽いed25519を使います。
sudo ssh-keygen -t ed25519
パスフレーズ(秘密鍵にかける暗証番号)を聞かれますので、入力します。利便性重視でかけない場合は、空欄のままEnterで構いません。
パスフレーズ:パスフレーズはクレジットカードの暗証番号のようなものです。万が一落としたり盗まれてしまった時に悪用されるのを防ぎます。秘密鍵の場合、盗まれた時に悪用されるまでの時間稼ぎとして使えますが、セキュリティ強化の効果は比較的薄い(秘密鍵ファイルにブルートフォースアタックできてしまう)ので、過信してはいけません。
パスフレーズはSSHにログインするたび入力するので、ご自身の使いやすい複雑さがいいと思います。
ぶっちゃけ利便性重視なら設定しなくてもいいと思います(設定しなければワンクリックでログインできる)。
実行したら、ホームディレクトリの.ssh(“/home/ユーザ名/.ssh”)に“cd 移動したいディレクトリ”コマンドで移動し、“ls”コマンドで公開鍵ファイル(id_ed25519.pub)と秘密鍵(id_ed25519)があることを確認します。
確認できたら、SSHで使えるように公開鍵ファイルを“authorized_keys”にリネームします。リネームは、“mv ファイル名 新しいファイル名”コマンドで出来ます。
#.sshディレクトリに移動
cd /home/ユーザ名/.ssh
#ディレクトリ内のファイルを確認
ls
#id_ed25519.pubをauthorized_keysにリネーム
mv id_ed25519.pub authorized_keys
mvコマンドは本来ファイルを移動するためのコマンドですが、名前変更にも使えます。
秘密鍵をダウンロードする
続いて、秘密鍵ファイルを手元にダウンロードします。
VS-Codeにて新しいウィンドウでコマンドラインに入り、左上の「エクスプローラー」から「フォルダーを開く」をクリックします。
するとサーバ内のディレクトリを選択できますので、さきほどの/home/ユーザ名/.sshディレクトリを開きます。
開いたらファイル一覧が表示されますので、秘密鍵ファイル(id_ed25519)をWindowsの任意の場所へダウンロードします(VS-Codeのconfigファイルと同じところがおすすめ)。
VS-Codeで公開鍵認証を使うように設定する
秘密鍵をダウンロードできたら、VS-Codeで公開鍵認証方式を使うように設定します。
6-1で作ったVS-Codeの構成ファイル(C:\Users\ユーザ名\.ssh\config)を開き、以下の項目を追加します。
#以下の項目を追加
PasswordAuthentication no
PreferredAuthentications publickey
IdentityFile 秘密鍵のファイルパス
#完成形の例は以下のようになります。
Host myserver
HostName xxx.xxx.xxx.xxx
Port 1234
User sumomomomomomomomo
PasswordAuthentication no
PreferredAuthentications publickey
IdentityFile C:\Users\sumomo\.ssh\id_ed25519
できたら「リモート」のところのリロードボタンを押して再読み込みし、サーバにログインしてみます。
パスフレーズを入力してログインできたら成功です。
うまくできなかったら、今追加した行をコメントアウトすると再びパスワード認証でログインできるようになります。
なんかそもそも接続できなくなった(パスフレーズを求める画面すら出てこない)場合はVS-Codeのconfigファイルと同じところにある、known_hostsファイルを消してみてください。
パスワード認証を無効にする
無事公開鍵認証方式でログインできたら、パスワード認証方式は使わないので無効にしてセキュリティを強化します。
サーバのsshd_configファイルを開いて、以下の内容を追記しリスタートします
#ファイルをviエディタで開く
sudo vi /etc/ssh/sshd_config
#以下の内容を追記してパスワード認証を無効にする
PasswordAuthentication no
#サービスをリスタートする
sudo systemctl restart sshd
パスワード認証を試して(さっきVS-Codeのconfigファイルに追記した行をコメントアウトしてログインする)、拒否されたらOKです。
ここまでで、Ubuntuサーバを安全に使うための初期設定(作業用ユーザの追加~公開鍵認証でのSSHログインまで)が完了しました。
おまけ:ホスト名(サーバ名)を変更する
おまけでホスト名(コンソールの“アカウント名@ホスト名~$”のところ)を変更する方法もご紹介しておきます。
サーバに推しの名前つけると愛着が湧いていい感じ。
ホスト名を変更するには、”hostnamectl set-hostname 新しいホスト名”を実行して再起動します。管理者権限が必要です。
#ホスト名を変更する
sudo hostnamectl set-hostname hachimiland
#再起動
sudo reboot
ログインしてホスト名が変わっていたらOK。
終わり
長い記事になりましたが、Linux触り始める方の理解をお手伝い出来ましたら幸いです。
あとはnginxを入れたりunbound入れたり、自由にエンジニアリングしてください。
よきLinuxライフを!
コメント