ネット上の安全が叫ばれ続ける昨今、我がサーバも零細ウェブサイトとは言え油断はできない。ぼけーっとnginxのaccess.logを眺めているとwp-login.phpにやたらといろんなIPからアクセスがある。
208.113.198.170 - - [02/Jul/2013:02:42:05 +0900] "POST /wp-login.php HTTP/1.0" 404 9762 "http://k-institute.jp/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "208.113.198.170"
208.113.198.170 - - [02/Jul/2013:02:42:05 +0900] "POST /wp-login.php HTTP/1.1" 404 3416 "http://k-institute.jp/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
63.143.48.164 - - [02/Jul/2013:02:42:06 +0900] "POST /wp-login.php HTTP/1.0" 404 9762 "http://k-institute.jp/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "63.143.48.164"
63.143.48.164 - - [02/Jul/2013:02:42:06 +0900] "POST /wp-login.php HTTP/1.1" 404 3416 "http://k-institute.jp/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
67.210.247.221 - - [02/Jul/2013:02:42:08 +0900] "POST /wp-login.php HTTP/1.0" 404 9762 "http://k-institute.jp/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "67.210.247.221"
67.210.247.221 - - [02/Jul/2013:02:42:08 +0900] "POST /wp-login.php HTTP/1.1" 404 3416 "http://k-institute.jp/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
wp-login.phpは、言わずと知れたWordPressの管理画面へのログインページだ。Knoledgeアンテナ研究室も新システムへ移行して、最早WordPressなど使っていないにも拘らずwp-login.phpにやたらとアクセスがあり、それらのアクセスに対して律儀に404を返し続けている。攻撃が来るIPに統一性が無い所を見ると、このIPたちはただの踏み台だと思われ、IPで弾いても意味がなさそうだ。なので別の対策を講じておいた。どんな対策を講じたのかは、攻撃者に読まれて迂回されると癪なので内緒である。
Webサーバに対してさえこうなのだから、sshdに対してもデフォルトのポート22のままで運用しているといつ何時、世界中からアタックされないとも限らない。実際、/var/log/secure を確認してみると、驚くほどアタックされているのがわかる。ちょっと抜粋するとこんな感じだ。
Jun 12 17:23:45 v2930 sshd[6766]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122 user=root
Jun 12 17:23:48 v2930 sshd[6766]: Failed password for root from 46.20.12.122 port 46490 ssh2
Jun 12 17:23:48 v2930 sshd[6767]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:23:51 v2930 sshd[6770]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:23:51 v2930 sshd[6770]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122 user=root
Jun 12 17:23:53 v2930 sshd[6770]: Failed password for root from 46.20.12.122 port 46871 ssh2
Jun 12 17:23:53 v2930 sshd[6771]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:23:56 v2930 sshd[6772]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:23:56 v2930 sshd[6772]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122 user=root
Jun 12 17:23:58 v2930 sshd[6772]: Failed password for root from 46.20.12.122 port 47239 ssh2
Jun 12 17:23:58 v2930 sshd[6774]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:24:01 v2930 sshd[6775]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:24:01 v2930 sshd[6775]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122 user=root
Jun 12 17:24:03 v2930 sshd[6775]: Failed password for root from 46.20.12.122 port 47620 ssh2
Jun 12 17:24:03 v2930 sshd[6776]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:24:06 v2930 sshd[6777]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:24:06 v2930 sshd[6777]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122 user=root
Jun 12 17:24:07 v2930 sshd[6777]: Failed password for root from 46.20.12.122 port 47983 ssh2
Jun 12 17:24:08 v2930 sshd[6778]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:24:10 v2930 sshd[6780]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:24:10 v2930 sshd[6780]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122 user=root
Jun 12 17:24:13 v2930 sshd[6780]: Failed password for root from 46.20.12.122 port 48280 ssh2
Jun 12 17:24:13 v2930 sshd[6781]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:24:15 v2930 sshd[6783]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:24:15 v2930 sshd[6783]: Invalid user oracle from 46.20.12.122
Jun 12 17:24:15 v2930 sshd[6784]: input_userauth_request: invalid user oracle
Jun 12 17:24:15 v2930 sshd[6783]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 17:24:15 v2930 sshd[6783]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=46.20.12.122
Jun 12 17:24:17 v2930 sshd[6783]: Failed password for invalid user oracle from 46.20.12.122 port 48623 ssh2
Jun 12 17:24:18 v2930 sshd[6784]: Received disconnect from 46.20.12.122: 11: Bye Bye
Jun 12 17:24:20 v2930 sshd[6787]: reverse mapping checking getaddrinfo for host-46-20-12-122.ttnetdc.com [46.20.12.122] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 12 17:24:20 v2930 sshd[6787]: Invalid user test from 46.20.12.122
Jun 12 17:24:20 v2930 sshd[6789]: input_userauth_request: invalid user test
Jun 12 19:30:12 v2930 sshd[10830]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=67.205.67.135 user=root
Jun 12 19:30:14 v2930 sshd[10830]: Failed password for root from 67.205.67.135 port 54896 ssh2
Jun 12 19:30:14 v2930 sshd[10831]: Received disconnect from 67.205.67.135: 11: Bye Bye
Jun 12 19:30:16 v2930 sshd[10833]: Invalid user admin from 67.205.67.135
Jun 12 19:30:16 v2930 sshd[10834]: input_userauth_request: invalid user admin
Jun 12 19:30:16 v2930 sshd[10833]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 19:30:16 v2930 sshd[10833]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=67.205.67.135
Jun 12 19:30:18 v2930 sshd[10833]: Failed password for invalid user admin from 67.205.67.135 port 55210 ssh2
Jun 12 19:30:18 v2930 sshd[10834]: Received disconnect from 67.205.67.135: 11: Bye Bye
Jun 12 19:30:20 v2930 sshd[10856]: Invalid user guest from 67.205.67.135
Jun 12 19:30:20 v2930 sshd[10858]: input_userauth_request: invalid user guest
Jun 12 19:30:20 v2930 sshd[10856]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 19:30:20 v2930 sshd[10856]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=67.205.67.135
Jun 12 19:30:22 v2930 sshd[10856]: Failed password for invalid user guest from 67.205.67.135 port 55497 ssh2
Jun 12 19:30:22 v2930 sshd[10858]: Received disconnect from 67.205.67.135: 11: Bye Bye
Jun 12 19:30:24 v2930 sshd[10873]: Invalid user test from 67.205.67.135
Jun 12 19:30:24 v2930 sshd[10874]: input_userauth_request: invalid user test
Jun 12 19:30:24 v2930 sshd[10873]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 19:30:24 v2930 sshd[10873]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=67.205.67.135
Jun 12 19:30:26 v2930 sshd[10873]: Failed password for invalid user test from 67.205.67.135 port 55810 ssh2
Jun 12 19:30:26 v2930 sshd[10874]: Received disconnect from 67.205.67.135: 11: Bye Bye
Jun 12 19:43:34 v2930 sshd[11379]: Connection closed by 111.216.58.196
Jun 12 21:07:01 v2930 sshd[14450]: input_userauth_request: invalid user abc
Jun 12 21:07:01 v2930 sshd[14449]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 21:07:01 v2930 sshd[14449]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.186.211.46
Jun 12 21:07:04 v2930 sshd[14449]: Failed password for invalid user abc from 118.186.211.46 port 52280 ssh2
Jun 12 21:07:04 v2930 sshd[14450]: Received disconnect from 118.186.211.46: 11: Bye Bye
Jun 12 21:07:04 v2930 sshd[14451]: Invalid user abc123 from 118.186.211.46
Jun 12 21:07:04 v2930 sshd[14452]: input_userauth_request: invalid user abc123
Jun 12 21:07:04 v2930 sshd[14451]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 21:07:04 v2930 sshd[14451]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.186.211.46
Jun 12 21:07:07 v2930 sshd[14451]: Failed password for invalid user abc123 from 118.186.211.46 port 53608 ssh2
Jun 12 21:07:07 v2930 sshd[14452]: Received disconnect from 118.186.211.46: 11: Bye Bye
Jun 12 21:07:07 v2930 sshd[14455]: Invalid user abc from 118.186.211.46
Jun 12 21:07:07 v2930 sshd[14456]: input_userauth_request: invalid user abc
Jun 12 21:07:07 v2930 sshd[14455]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 21:07:07 v2930 sshd[14455]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.186.211.46
Jun 12 21:07:10 v2930 sshd[14455]: Failed password for invalid user abc from 118.186.211.46 port 54801 ssh2
Jun 12 21:07:10 v2930 sshd[14456]: Received disconnect from 118.186.211.46: 11: Bye Bye
Jun 12 21:07:10 v2930 sshd[14457]: Invalid user abc from 118.186.211.46
Jun 12 21:07:10 v2930 sshd[14458]: input_userauth_request: invalid user abc
Jun 12 21:07:10 v2930 sshd[14457]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 21:07:10 v2930 sshd[14457]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.186.211.46
Jun 12 21:07:13 v2930 sshd[14457]: Failed password for invalid user abc from 118.186.211.46 port 56232 ssh2
Jun 12 21:07:13 v2930 sshd[14458]: Received disconnect from 118.186.211.46: 11: Bye Bye
Jun 12 21:07:13 v2930 sshd[14459]: Invalid user administrator from 118.186.211.46
Jun 12 21:07:13 v2930 sshd[14460]: input_userauth_request: invalid user administrator
Jun 12 21:07:13 v2930 sshd[14459]: pam_unix(sshd:auth): check pass; user unknown
Jun 12 21:07:13 v2930 sshd[14459]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=118.186.211.46
Jun 12 21:07:16 v2930 sshd[14459]: Failed password for invalid user administrator from 118.186.211.46 port 57400 ssh2
46.20.12.122はトルコから、67.205.67.135はカナダのiWeb Technologies Inc.と言う会社が運営しているデータセンタにおいてあるサーバから、118.186.211.46さんに至っては中国は北京から。実に様々なところから攻撃されている。アタックするユーザーも最初は root に始まって administrator や dauser 、abc、abc123 、alex 、test、dave 等々ひっきりなしにアタックされている。うちにはアレックスもデイブも居ません。
24時間365日アタックされ続けて、こんなことにマシンパワーを使ってしまっているのはもったいない。勿体ないお化けが出る。なので3つの対策をとることにする。
1.Portをデフォルトの22から変える。
2.認証をパスワード認証から、証明書認証に変える。
3.使わないときにはsshdを落とす。
以下作業の備忘録
1./etc/ssh/sshd_config の編集
ポート番号を変えたり、rootログインを禁止したり、ログインユーザーを制限したりする。ポート番号は、他のソフトウェアと被らない様に割り当て済みポートを避けて設定するといい。
# cp -p sshd_config sshd_config.bk
# vi sshd_config
~省略~
Port ポート番号 ←ポート番号を変更
~省略~
RSAAuthentication yes ←RSAによる認証
PubkeyAuthentication yes ←公開鍵による認証
AuthorizedKeysFile .ssh/authorized_keys ←鍵ファイル
~省略~
PermitEmptyPasswords no ←空パスワードを禁止
PasswordAuthentication no ←パスワード認証を禁止
AllowUsers 許可するユーザー名 ←許可するユーザを限定
~省略~
#
#
2.証明書の発行
接続を許可するユーザーにスイッチして証明書を作る。
# su - 許可するユーザー
$
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa): ← ENTER
Created directory '/home/ユーザ名/.ssh'.
Enter passphrase (empty for no passphrase): ←パスワードを入力してENTER
Enter same passphrase again: ←パスワード再入力してENTER
Your identification has been saved in /home/ユーザ名/.ssh/id_rsa.
Your public key has been saved in /home/ユーザ名/.ssh/id_rsa.pub.
The key fingerprint is:
0x:3x:2x:1x:1x:2x:x3:x4:x5:x6:77:88:x7:x8:x9:ff ユーザ名@ホスト名
The key's randomart image is:
+--[ RSA 2048]----+
| +E= |
| o |
| + ++o+ . o. |
| o |
| o . o |
| . + o o |
| o |
| o +o==++ |
| o. . .. |
+-----------------+
$ cd ~/.ssh/
$ mv ./id_rsa.pub ./authorized_keys ←公開鍵を sshd_config に書いたファイル名に変更
$ chmod 600 ./authorized_keys ←自分以外には触らせない
sshdの再起動や、iptableの設定変更をする前にscp等で秘密鍵 ~/.ssh/id_rsa をsshのクライアントとなる端末にscpなどで取得しておくのを忘れない様にしなければ、証明書が無いとログインできないが証明書はサーバーにしかないという悲惨な状況になってしまうので注意が必要だ。
3.sshdの再起動とiptableの設定変更
ポート番号を変えたので、iptableの設定も変えておく。その後sshdも再起動して設定変更を有効化する。しつこいようだがこの作業以降は証明書が無いとログインできない。秘密鍵を取得してから行う。
# vi /etc/sysconfig/iptables
~省略~
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT ←削除
-A INPUT -m state --state NEW -m tcp -p tcp --dport ポート番号 -j ACCEPT ←変更したポート番号に更新
~省略~
# /etc/init.d/iptables restart
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: モジュールを取り外し中: [ OK ]
iptables: ファイアウォールルールを適用中: [ OK ]
#
# sshd -t ←設定ファイルにエラーが無いか確認
#
# /etc/init.d/sshd restart
sshd を停止中: [ OK ]
sshd を起動中: [ OK ]
#
# su - ユーザー名
$
$
$ ssh -p 変更したポート番号 localhost ←ログインできるか確認
RSA key fingerprint is 17:c6:37:e9:d4:bc:f2:44:f2:0d:1b:45:95:6a:6e:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Enter passphrase for key '/home/ユーザー名/.ssh/id_rsa':
パスワード認証を禁止したはずなのにパスワードを聞かれるのは、2.証明書の発行の手順で、証明書の作成時にパスワードを入力したからだ。あそこでパスワードを入力せずに空ENTERで作成した証明書を使えばここでパスワードを聞かれることはない。認証はあくまで証明書で行われており、証明書を使用するためにパスワードが必要となっていると理解すればいい。
4.ターミナルエミュレータputtyでログインしてみる
puttyで秘密鍵を使うには、puttygen.exe と言うプログラムを使ってppk形式に証明書を変換する必要があるらしい。めんどくさい。puttygen.exeを起動してみる。
↑読み込みをクリックして、取得した秘密鍵(ida_ras)を選択する。
↑puttyを起動して「認証」→「認証パラメータ」にて作成したppk形式の秘密鍵を設定して
「セッション」→「ポート(P)」項目でport番号を変更して接続する。
これで接続が成功すればOKである。rootやほかのユーザーでログインしてみて、弾かれれば成功だ。やったぜ。因みに、puttyではなくテスト環境から接続したり、scpでファイル転送したりする場合もport指定や、鍵ファイルの指定が必要になるので色々オプションをつけないといけない。
# ssh -i 鍵ファイル -p ポート番号 ホスト名かIP
# scp -i 鍵ファイル -P ポート番号 コピー元 コピー先
ポート番号のオプションは ssh が小文字、scp が大文字であるところがミソだ。この設定にしてから/var/log/secure を観察しているがとりあえず猛烈アタックは収まったみたいだ。ともあれ、ログ監視の仕組みを導入する必要がるかなぁと本気で検討しなければいけないかもしれない。Zabbix でも導入しようかしら。しかしそれはまた、別のお話。