はじめに
最近、記事を書いている際に画像ファイルが急にアップロードできなくなり、原因を調べてみたところ、本Webサイトのjournalログが激増したせいでfilesystemの使用率が100%となっていました。
ということで、いろいろと対応策を検討&実行した結果、sshdのポート番号を変更することとしましたので、この記事ではsshdのポート番号を変えるに至るまでの経緯について書きます。
journalログの内容を調べてみた。
filesystemの使用率が100%の状況が続くと、思わぬところでファイルを削除してしまう(実際、本Webサイト用にカスタマイズしたPHPファイルのインストール時にこのエラーが発生してファイルがインストールされないどころか、もともとあったPHPファイルも削除されてしまうことがありましたw)等の問題が発生する可能性がありますので、root権限で以下のコマンドを実行して古いjournalログを削除してfilesystemのスペースを少し解放し、いったん落ち着きます。
filesystemのスペースがあいて落ち着いたところで、以下のコマンドを実行します。
上記のコマンドの実行結果として出力されるjournalのログをよーく観察すると…
ってな感じのログが大量に出力されてました(IPアドレスの部分は加工しています)。
つまり、
- 多数のクライアントからのsshdへのアクセスが大量に行われる。
- アクセス自体は失敗するものの、失敗した旨のメッセージがjournalログに書き込まれる。
- journalログの大きさが膨れ上がり、filesystemの使用率が100%に達する。
- 画像ファイルがWordpressにアップロードできなくなる。←今ここ!!
という状況になっていたっぽいです。
「第n種DDoS攻撃のようなもの」が成立していた模様です。
最初の解決案
まずは、sshdへのアクセスを試みているクライアントのIPアドレスを抽出すべく、root権限で以下のコマンドを実行してIPアドレスとログに記録されている回数を確認します。
スポンサーリンク
上記のコマンドにより抽出されたIPアドレスについてroot権限で以下のコマンドを実行し、アクセスを拒否するよう設定します。
# firewall−cmd --reload
なお、いくつかのIPアドレスを使い分けてsshdにアクセスしている可能性があるものについては、”/32″の部分を”/28″のように小さい数字にすることで、アクセスを拒否するIPアドレスの範囲を広げて設定します。
ここまでの作業を行った後に1時間ほど様子をみたところ、journalログの出力がいったん止まったように見えたので、翌朝に再度確認することにしました。
ここ2,3日の間に立て続けにpanda大学習帳のサーバのjournalログの出力のためにfilesystemの使用率が100%になってしまったので、その原因と思われるIPアドレス群からのリクエストを拒否する設定にしてみたところ、journalログの出力がほぼ止まりました。?
使用率の確認重要です。#lifeinyokohama— pandanote.info (@Pandanote_info) November 16, 2019
2番目の解決案
次の日の朝に、journalログのファイルサイズを調べてみたところ、10Mバイトにしたはずのjournalログが8時間くらいの間に約130Mバイトになっていました。journalログの内容を調べてみたところ、sshdへのアクセスを試みて失敗した旨のログが大量に記録されていました。
これでは比較的すぐにjournalログのためにfilesystemの使用率が100%になる可能性が高そうです。
そこで、sshd等の設定を変更することによりsshdのポート番号を変更することにしました。
ポート番号を変えるための設定
SELinuxの設定変更
以下のコマンドを実行し、SELinuxの設定を変更します。なお”abcde”には変更後のポート番号を指定します(以下同じです)。
sshdの設定変更
以下の手順でsshdの設定を変更します。
- /etc/sshd/sshd_configの設定のうち、
# Port 22スポンサーリンク
となっている行のコメントを外し、Port abcde
に変更します。 - root権限で以下のコマンドを実行し、sshdを再起動します。
# systemctl restart sshd
firewalldの設定変更
最後にfirewalldの設定を変更します。
以下の2通りの方法が考えられますが、どちらでも良いと思います(※個人の意見です)。
portの設定を追加する方法
root権限で以下のコマンドを実行し、abcde番portへのアクセスを許可します。なお、zone名には外部からのアクセスの設定を行っているものを指定します。
# firewall−cmd --reload
以下のコマンドを実行し、portsに”abcde/tcp”と表示されていれば、設定完了です。
<zone名> (active)
(中略)
ports: abcde/tcp
(後略)
専用のサービスを作る方法
firewalldのsshd用の設定ファイルをコピーして書き換えてabcde番port用で接続を待ち受けるsshd用の設定ファイルを作成する方法です。
以下の手順で設定します。
- root権限で以下のコマンドを実行し、コピー元となる設定ファイルをカスタマイズをした設定ファイル用のディレクトリにコピーします。
# cp /usr/lib/firewalld/services/ssh.xml \
/etc/firewalld/services/ssh-abcde.xml - /etc/firewalld/services/ssh-abcde.xmlを適当なエディタで開き、portタグのport属性を以下のように変更し、保存します。
<port protocol="tcp" port="abcde"/>
- root権限で以下のコマンドを実行し、ssh-abcde.xmlをサービスとして追加し、sshを削除します。
# firewall−cmd --zone=<zone名> --add−service=ssh-abcde --permanent
# firewall−cmd --zone=<zone名> --remove−service=ssh --permanent
# firewall−cmd --reload - root権限で以下のコマンドを実行し、servicesの項にssh-abcdeが含まれていて、かつsshが含まれていなければ設定完了です。
# firewall−cmd --list−all --zone=<zone名>
<zone名> (active)
(中略)
services: ssh-abcde
(後略)
動作の確認
適当な端末から以下のコマンドを実行し、ログインに成功したら動作確認完了です。
お疲れ様でした。
sshdのport番号変更後のjournalログの出力状況
sshdのport番号の変更後は、journalログにはsshdへのアクセスが原因と思われるメッセージが出力されなくなりました。
他にもNetworkManagerが大量に出力しているjournalログがあることがわかったので、journalログの出力が本当に必要なメッセージだけになるという状態にはなっていませんが、出力量は1/4程度に減っているようです。
まとめ
sshのポート番号を変えることにより、journalログが激増する感じではなくなりましたので、journalログを大量に出力することによるサーバのパフォーマンスの低下も防げそうです。
また、NetworkManagerがjournalログを出力する原因は不要なインターフェースを短い周期でenableに使用して失敗している旨のメッセージが出力されていることが原因のようですので、そのインターフェースをdownさせることにより、journalログの出力についても何とか適正化できそうです。
なお、sshdの設定(sshd_config)ですが、ポート番号を変更してもアクセスがされる(ログインに失敗した旨のメッセージが表示される)場合にはパスワード認証はnoにしておきましょう。
SSHのポート番号を22とはまったく無関係なものに変えてみたのですが、それでも攻撃的なアクセスが来ているようなので、PasswordAuthentication を no に設定してみた。#などど#lifeinyokohama
— pandanote.info (@Pandanote_info) August 24, 2020
この記事は以上です。