2020/11/19

SSHサーバのインストールと設定 | Ubuntu 20.04 Server

先日、開発・テスト用にVMWare上にUbuntu 20.04 Serverを構築しました。構築と言ってもUbuntuのサイトからISOファイルをダウンロードし、仮想マシンにインストールしただけですが。

現状は最小限のコンポーネントしかインストールしていませんので、今後必要に応じて拡張していきたいと思います。まずは手始めに外部からサーバにアクセスできるようにするために、SSHサーバをインストール・設定したいと思います。


SSHサーバのインストール

SSHサーバとしてOpen SSH Serverをインストールします。aptコマンドでopenssh-serverを指定すると自動で関連する必要なパッケージとともにSSHサーバをインストールしてくれます。

sudo apt install openssh-server
Reading package lists...
Building dependency tree...
Reading state information...
Suggested packages:
  molly-guard monkeysphere ssh-askpass
The following NEW packages will be installed:
  openssh-server
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
Need to get 377 kB of archives.
After this operation, 1,527 kB of additional disk space will be used.
Get:1 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 openssh-server amd64 1:8.2p1-4ubuntu0.1 [377 kB]
Preconfiguring packages ...
Fetched 377 kB in 0s (3,916 kB/s)
Selecting previously unselected package openssh-server.
(Reading database ... 71013 files and directories currently installed.)
Preparing to unpack .../openssh-server_1%3a8.2p1-4ubuntu0.1_amd64.deb ...
Unpacking openssh-server (1:8.2p1-4ubuntu0.1) ...
Setting up openssh-server (1:8.2p1-4ubuntu0.1) ...
rescue-ssh.target is a disabled or a static unit, not starting it.
Processing triggers for systemd (245.4-4ubuntu3.3) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for ufw (0.36-6) ...


SSHサーバのステータスの変更

インストール後のSSHサーバの稼働状態を確認します。statusを指定した場合は現在の稼働状態を表示しますが、start, stop, restartを指定することでSSHサーバを起動、停止、再起動することができます。

sudo systemctl status sshd
 ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-11-17 07:38:24 UTC; 8h ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 25980 (sshd)
      Tasks: 1 (limit: 2282)
     Memory: 1.1M
     CGroup: /system.slice/ssh.service
             └─25980 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

Nov 17 07:38:24 xxx systemd[1]: Starting OpenBSD Secure Shell server...
Nov 17 07:38:24 xxx sshd[25980]: Server listening on 0.0.0.0 port 22.
Nov 17 07:38:24 xxx sshd[25980]: Server listening on :: port 22.
Nov 17 07:38:24 xxx systemd[1]: Started OpenBSD Secure Shell server.


ホストファイアウォールの設定

Ubuntu 20.04にはデフォルトでufwというホストファイアウォールが備わっています。まずはファイアウォールの状態を確認してみます。

sudo ufw status
Status: inactive

私の環境では無効となっていました。ファイアウォールを有効化してみます。

sudo ufw enable
Firewall is active and enabled on system startup

ファイアウォールが有効になりました。それではSSHサーバの通信ポートを許可します。

sudo ufw allow ssh
Rule added
Rule added (v6)

ステータスを確認します。

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)


SSHコマンドを使ったSSHサーバへの接続

リモートクライアントからSSHサーバへアクセスしてみます。

SSHサーバIPアドレスの確認

最初に、リモートクライアントがこのSSHサーバへアクセスするために、SSHサーバのIPアドレスを確認します。このIPアドレスは、リモートクライアントが内部ネットワークにあるのかどうかで変わります。

リモートクライアントが内部ネットワーク内(例:社内や自宅内)である場合、プライベートIPアドレスで接続できます。ip aコマンドでSSHサーバ自体のIPアドレスを表示します。

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:b5:f2:00 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.100/24 brd 10.10.10.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:feb5:f200/64 scope link
       valid_lft forever preferred_lft forever

リモートクライアントがインターネットの先にある場合、SSHサーバのインターネットIPアドレス(パブリックIPアドレス)で接続できます。以下のコマンドでインターネットIPアドレスを表示できます。

echo $(wget -qO - https://api.ipify.org)


インターネット経由でSSHサーバへアクセスする場合、実際にはファイアウォールでSSHポート(22/tcp)への外部からの通信が許可されていること、インタネットIPアドレスからSSHサーバへ到達できるようにNATやルーティングがなされていることが前提です。会社のネットワークの場合は、通常許可していないはずです。その場合は、社内ポリシーをご確認の上、別記事に記載したngrokの利用をご検討ください。


リモートクライアントからSSHサーバへ接続

リモートクライアント(例:Windows10クライアント)から、コマンドプロンプトまたはターミナルを起動し、sshコマンドを実行します。

ssh username@10.10.10.100

最近のWindows10には標準でSSHクライアントソフトがインストールされているようです。


(オプション)SSH接続ポートの変更

セキュリティの理由から、デフォルトのSSHのポート番号(22/tcp)を変えることが推奨される場合もあります。1023番までのポートはWell knownポートと呼ばれ、よく知られたサービスやプロトコルが利用するため、1024番以上のポートを指定します。ポート番号を変更するためには、/etc/ssh/sshd_config#Port 22をコメントアウトし、ポート番号を変更します。例えば20022/tcpとします。

変更後は、ファイアウォールで新しいポート番号を開ける必要があります。

sudo ufw allow 20022/tcp

変更を適用するために、SSHサービスを再起動します。

sudo systemctl restart sshd

最後に、リモートクライアントからは以下のSSHコマンドを実行します。

ssh -p 20022 username@10.10.10.100


以上で、ポート番号の変更は完了です。


実際には、SSHサーバを直接公開するようなネットワーク仕様は少なくなってきていると思います。外部から接続する場合の多くは、踏み台サーバ(Bastion Host)にログインしてから目的のSSHサーバにアクセスしたり、内部からの接続であっても特権管理サーバを経由したりします。

ところで、SSH接続ポートを変更したからと言って攻撃者に対する有効策になるとは限りません。nmapなどのスキャンツールでポートスキャンした際、ポート番号を変えていてもSSHサーバのレスポンスで容易にSSHサーバだと特定されてしまいます。そういう意味でも、セキュリティを強化する場合は多段防御の考え方でセキュリティ策を打つ必要がありますね。