見出し画像

VPSのセキュリティ対策について2024(追記あり)

わーさんが初心者なのにFediverse自鯖ハウツー本を書こうとして下書きしていた原稿からの転載になります。
 目次記事はこちら。

※2024年4月17日時点での所感です。
10:40にsudoについての指摘を修正しております。
20:25にファイアウォール関連を追記しております。

 VPSの乗っ取りなどを防ぐために行っておいた方が良いとされる安全対策がいくつかありますので、記載していきます。今回取り上げるのは、作業用(一般)ユーザーの作成とroot封じ、ファイアウォールの設定などです。

 rootというユーザーは、管理者です。何でもできてしまいますので、よく狙われます。
 rootではうっかり重要なファイルを消す、なども簡単にできてしまうので、一般ユーザーを作成し、そこで管理者権限のコマンドを出せるようにすることが多いです。これが作業用ユーザーの作成です。

 管理者権限のコマンドの頭には、『sudo』とつきます。substitute user doの頭文字だという噂です。追加で設定しない限り、一般ユーザーでsudoを入れても「そんな権限ないよ」と怒られたり、管理者権限を持つ一般ユーザーでも何分かに1回はパスワードを要求されますので、rootよりはうっかりが減ることでしょう。

 一方で、外部からrootとしてログインできないように設定すること、パスワードでのログインを許可しないことなども、セキュリティ対策として有名です。特にパスワードについては、総当たり戦法が取れたりしますからね。

 SSH接続について、デフォルトでは22番ポートが使われることが多いと前述しましたが、裏を返せばそこが入口だろうと推測され、攻撃の対象にされることもあるとして、SSH接続に使うポートを変更する方もいます。

 SSH接続のポート変更やログイン関連に関しては、同一の設定ファイルを編集する事になるため、まとめて記載します。

 以下からしばらくのコマンドは、Ubuntuでの操作を前提としています。
 Arch Linuxなど、別のOSでは該当コマンドが異なる場合も多々ございますので、ご留意ください。


一般ユーザーの作成

コマンドとしては、以下です。

sudo adduser ユーザー名

 別記事の『Linux系初心者引っかかったあるある』でも述べましたが、パスワード入力時にはカーソルを含めて一切の表示が見えません。これはパスワード設定時にも適応されますので、ご注意ください。

 そのユーザーに管理者権限のコマンドを出せるようにするコマンドが、こちら。

sudo gpasswd -a ユーザー名 sudo

 本当に管理者権限を得られたのか、安全に確認しやすいコマンドを試すには、まず作成した一般ユーザーにログインします。

sudo su - ユーザー名

 そして、以下です。

sudo id

一般ユーザーでSSH接続できるようにする

 次に、作成したユーザーでもSSH接続できるように設定したいので(何せ最終目標はrootを封じてしまうこと)、SSH鍵を新たに作成、または、少々強引な手段として、rootからコピペします。

ターミナルでSSH鍵を新たに作成する場合

 一旦SSH接続を解除し、どこのVPSにも繋がっていない状態で以下のコマンドを使います。

ssh-keygen

 VPS側で鍵の形式を指定されている場合は、ssh-keygen -t ed25519やssh-keygen -t rsaのように、-t 鍵形式、で指定できるようです。
 また、鍵の保存場所指定時に、鍵のファイル名を変更することができます。複数の鍵を管理したいときなどに、ご活用ください。

 鍵が作成されたか確認するには、以下のコマンドで鍵のあるはずのフォルダへ接続します。

cd ~/.ssh

 そして、以下のコマンドで、フォルダの中を確認します。

ls -l

 鍵のファイル名で指定した名前のファイルと、加えて.pubのついたファイルがあれば、それがSSH鍵のペアです。.pubがついた方のファイルが公開鍵となり、VPSに入れておく必要のあるものです。

 作成した鍵をVPSに転送するには、以下のコマンドが便利です。

ssh-copy-id -i 公開鍵のファイル名 ユーザー名@IP

 ただし、当該ユーザーがパスワードでログインできることが前提となりますので、もしもパスワード認証が既に禁止されていた場合は、一度パスワード認証を許可し、鍵を追加後に改めてパスワード認証によるログインを禁止する事になります。

 パスワード認証によるログインについては、VPS内の/etc/ssh/sshd_configというファイルで規定されています。このファイルはrootでのログインを禁止するかどうかについても規定するファイルなので、詳細は後述します。

rootからSSH鍵をコピペする場合

 以下のコマンドで、rootの持つ鍵を一般ユーザーに引っ張ってくることができます。

cp --recursive .ssh /home/ユーザー名/.ssh

 これだけだと、鍵の持ち主がrootのままで一般ユーザーには使えないので、鍵の持ち主を一般ユーザーに変更します。

chown --recursive ユーザー名: /home/ユーザー名/.ssh


 上記いずれのパターンにしても、SSH鍵を設定したら一度exitなどでログアウトし、作成した一般ユーザーでもSSH接続が可能かどうか、確認すると良いでしょう。
 ターミナルで、取り敢えず接続が可能かを確認するコマンドは、以下です。

ssh ユーザ名@IP -p ポート番号 -i 秘密鍵へのパス

 まだ/etc/ssh/sshd_configをいじっていなければ、デフォルトでは22番ポートがSSH用とされています。

rootとしてのログインやパスワードによるログインを禁止する

 前述の、VPS内、/etc/ssh/sshd_configというファイルに、SSH接続やログインなどに関する設定が詰め込まれています。
 つまり、このファイルをいじればログインに関するあれやこれやの設定を変更することができる一方、ここで下手な設定をしてしまうと、せっかく作ったサーバーに接続してもログインすることができなくなってしまいます。慎重に編集しましょう。

 とは言うものの、LinuxなどのCUIではどうやってファイルを編集するのでしょう?

 Linux系で使える有名なテキストエディタとしては、vim(多分)やnanoがあります。
 筆者は最初に覚えたのがnanoでの操作だったため、nanoで操作していることが多いですが、どのテキストエディタを使うかについては様々な意見があるため、お気に入りのエディタを使うのが良いと思います。

備考・nanoの操作

 nanoでファイルを編集する場合、以下のように開始します。

nano ファイル名

 nanoでは、一般的な矢印ボタンやHome/Endなどを利用してカーソルを移動できます。
 終了はCtrl(又はcontrol)+Xで、変更を保存するか聞かれた場合Y(Yes)を入力しEnterするとファイル名の確認の後、保存することができます。この時、既存のファイル名であれば上書きされますし、新規の名前であれば新規に作成して保存されます。
 下部にコマンド一覧が表示されるので、^をCtrl(又はcontrol)と読み替えて操作の参考にすると良いでしょう。

 なお、管理者権限の必要なファイルを編集するときは、さらに頭にsudoをつける必要があり、以下のようなコマンドになります。

sudo nano ファイル名

/etc/ssh/sshd_configの編集

 nanoを使用する場合、以下のコマンドで編集が開始できます。

sudo nano /etc/ssh/sshd_config

 もちろん、sudoコマンドを使用できる権限のあるユーザーで編集することが前提です。

 /etc/ssh/sshd_configには既に様々な設定が書き込まれており、しかも英語であるので、最初は目が滑るかもしれません。しかし、ここの設定を間違えるとせっかく借りたサーバーにログインできず、作り直しとなったりもするので、慎重に操作しましょう。

 rootログインを禁止にするには、以下のように編集します。

PermitRootLogin yes

PermitRootLogin no
([yes]を[no]に変えます)

 パスワードログインを禁止にするには、以下です。

PasswordAuthentication yes

PasswordAuthentication no
([yes]を[no]に変えます)

 また、SSH接続にはデフォルトで22番ポートが使われるため、22番ポートが狙われることも多いとして、そもそも他のポートからSSH接続するように設定する方もいます。その場合の設定方法は、以下です。

#Port 22

Port 任意の番号
(Portの前にある[#}を削除し、22を別の数字で設定します)

 この、別の数字ですが、1024 以上 49151 以下の好きな整数で指定します。好きな整数といっても 5432 はPostgreSQL(データベース)に、6379 は Redis(データベースや連合との通信管理)に使用されることが多いので、そこは避けてください。

#記号は、その行がコメントであり、実際のコードやコマンドではないことを示す記号です。#記号を消し、その行に効力を持たせることを、アンコメントする、などと表現します。

 編集が終われば、Ctrl(又はcontrol)+Xで終了すると保存の有無を聞かれます。上書き保存しましょう。その後は、以下のコマンドで設定を反映させてください。

sudo systemctl restart sshd

備考・ポート番号の変更について

 さくらのVPSでは、以下のように注釈があります。

セキュリティ対策として SSH ポート番号の変更を紹介されている事がありますが、万全ではありません。 10022/TCP, 1022/TCP, 2222/TCP など広く知られているポート番号も有る他、ポートスキャンによっても明らかになります。
また、 well-known ポート以外は、一般ユーザー権限で LISTEN できます。 シェルアクセスできる一般ユーザーや、脆弱性を持った CGI 経由などで、偽の SSH サーバープロセスを構築し LISTEN できる事を意味します。
受けるアタックを減らす効果は見込めますが、ポート番号の隠ぺいや秘匿性に依存せず、まずは、公開鍵認証やファイアウォールなどを設定することを強く推奨します。 変更される場合は、前述の well-known ポート以外は一般ユーザーで LISTEN できること、 SELinux などの強制アクセス制御が有効な場合は、ポート番号リソースが制限されている事にもご留意くさい。
また、ポートノッキングも1つの隠ぺい策として有名です。 SSHポート番号の変更と同様に、隠ぺいによるセキュリティである為、あくまで基本は公開鍵認証およびファイアウォールである事に留意する必要があります。

サーバー作成直後に設定しておくべき初期セキュリティ設定

ファイアウォールの設定

 各々のVPSサービスが、もしパケットフィルターなどの外部からのアクセスを制限するオプションを用意しているのであれば、それを利用するのも良いでしょう。

 ただし、自鯖の運用にあたっては、SSH用ポートの他にも絶対に開けておかないといけないポートがあります。80番と443番です。
 80番ポートはHTTP接続に使用され、443番ポートはHTTPS接続に使用されます。

 もしもVPS本体でファイアウォールを設定するならば、netfilter(iptables)をufwというアプリで操作して設定すると比較的簡単です。なお、MisskeyのBashスクリプトでは、このファイアウォール設定が自動でついてくる模様。

 コマンドについては、SSH接続を22番ポートで行っている場合、以下となります。

sudo ufw enable
sudo ufw default deny
sudo ufw limit 22
sudo ufw allow 80
sudo ufw allow 443

 ファイアウォールの状態を確認するコマンドは、以下です。

sudo ufw status

 そして、その設定を維持するために、以下のコマンドでしめます。

sudo systemctl enable ufw

備考・Fail2banについて

 さくらのVPSでは、以下のように注釈があります。

必要な場合、 IP ブラックリストソフトウェア( Fail2ban, SSHguard 等)を用いる事もできます。 これらのソフトウェアの多くはログ解析によって動作する為、ソフトウェアによってはログ解析脆弱性や、ログ溢れによる Disk full を狙われる事が有るので、適切な運用が必要です。 攻撃者があなたの IP アドレスを知っている場合、偽装したパケットによりロックアウトを狙う可能性も有るため、必要に応じて除外 IP アドレスなどを設定してください。

サーバー作成直後に設定しておくべき初期セキュリティ設定

 筆者は導入していませんが、Fail2ban( https://github.com/fail2ban/fail2ban )は以下のコマンドでインストールできるようです。

git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python setup.py install

 また、以下のコマンドで状態が確認できる模様。

fail2ban-client -h

Fail2ban( https://github.com/fail2ban/fail2ban )の公式サイトは英語ですので、見に行くときはご留意ください。


この記事が気に入ったらサポートをしてみませんか?