誰も覚えていなかったアカウント
ある小さな店のサーバーに、1年前に去った取引先のアカウントが残っていました。パスワードは要らず、root もネットワークからログインできました。
誰も攻撃しませんでした。先に見つけたのは、スキャナーでした。直すのに5分しかかかりませんが、初日にやるべきことでした。
今日は、誰かが攻撃する前に、この作業を済ませる方法を学びます。
このレッスンのゴール
メモ
サーバーの弱いアカウント、SSH の設定、ファイルのモードを見つけて、直せる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 堅牢化 | サーバーに要らないものを取り除いて、攻められる所を減らすこと | |
| アカウント | システムがログインを許す名前。それぞれに権限がある | |
| ファイルのモード | 誰が読み、書き、実行できるかを表す3桁の数 | 640 |
| 誰でも書ける | マシンのどのユーザーでも書き換えられるファイル | |
| SSH | ネットワーク越しにサーバーへログインする道具 | |
| 設定 | 設定ファイルの1行。名前と値でできている |
学生が入力するセルは、このプレビューでは空白です。
アカウントを並べ、誰が使うかを問う
知らないアカウントは、守れません。だから堅牢化は、一覧を作ることから始まります。
普通の人のアカウント番号(UID)は1000以上です。root の UID は0で、持ってよいのはroot だけです。
一般アカウントとシェルを並べる
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $7}' /etc/passwdここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
UID 0 のアカウントはどれか
awk -F: '$3 == 0 {print $1}' /etc/passwdここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2つの一覧の読み方
1つ目の Run は、一般アカウントごとに1行を書きます。名前と、ログインシェル(たとえば /bin/bash)です。各行について、まだ人が必要としているかを問いましょう。
2つ目の Run が書くのは、root の1語だけです。もう1つ名前があれば、2つ目の root であり、インシデントを開く理由です。
モードは、誰が何をできるかを表す
どのファイルにも、3桁のモードがあります。持ち主、グループ、それ以外の全員の順です。各桁は、読むなら4、書くなら2、実行するなら1を足します。
アカウントの一覧は公開で、誰でも読めます。パスワードのハッシュを入れたファイルは、そうであってはいけません。
2つのファイルのモードを見る
stat -c '%a %U:%G %n' /etc/passwd /etc/shadowここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
パスワードが空のアカウントを数える
sudo awk -F: '$2 == "" {print $1}' /etc/shadow | wc -lここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 4つのモードの意味
| モード | 持ち主 | グループ | それ以外の全員 |
|---|---|---|---|
| 644 | 読む、書く | 読む | 読む |
| 640 | 読む、書く | 読む | 何もできない |
| 2770 | 読む、書く、入る | 読む、書く、入る | 何もできない |
| 777 | すべて | すべて | すべて。だから誰でも書ける |
学生が入力するセルは、このプレビューでは空白です。
端末が書いたもの
stat の Run は2行を書きました。644 root:root /etc/passwd と 640 root:shadow /etc/shadow です。アカウントの一覧は誰でも読めます。ハッシュは root と shadow グループだけが読めます。
数える Run は 0 を書きました。他の数なら、パスワードなしでログインできるアカウントがあるということです。
SSH は扉、設定は鍵
SSH サーバーは、設定ファイルを読みます。危険の大半を決めるのは3行です。root がログインできるか、パスワードを使えるか、空のパスワードを許すか、です。
練習は、自分のフォルダにあるコピーで行います。本物のファイルには触らないので、誰も締め出されません。
弱い練習用ファイルを書く
printf 'PermitRootLogin yes\nPasswordAuthentication yes\nPermitEmptyPasswords no\n' > sshd-practice.confここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
弱い2行を見つける
grep -E '^(PermitRootLogin|PasswordAuthentication) yes' sshd-practice.confここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sed で2つとも直す
sed -i 's/^PermitRootLogin yes/PermitRootLogin no/; s/^PasswordAuthentication yes/PasswordAuthentication no/' sshd-practice.confここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一度ファイルを確かめる
grep -E '^(PermitRootLogin|PasswordAuthentication)' sshd-practice.confここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最初の値が大事な理由
一連の最初の Run は、2行を見つけました。直したあとは、どちらも no です。これで、パスワードでのログインと、root としてのログインが止まります。ログインは鍵で行うので、本物のサーバーでは、先に鍵を用意しないと自分も入れなくなります。
もう1つの決まりがあります。SSH サーバーは、同じ設定の最初の値を使います。上にある弱い行が、下の安全な行に勝ちます。
どの行が効くかを見る
printf 'PermitRootLogin no\nPermitRootLogin yes\n' | grep -m1 '^PermitRootLogin'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
設定ファイルは最後の行が勝つと思い、安全な行を末尾に足す人が多くいます。SSH サーバーでは最初の行が勝つので、上の弱い行が今も効いています。足すのではなく、今ある行を直しましょう。
練習用のファイルを消す
rm sshd-practice.confここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
発展: ラボ自身のフォルダ
ラボの課題2を終えたら、ls -ld /srv/projects と stat -c '%a %U:%G %n' /srv/projects を実行します。誰が入れるか、どの桁がそれ以外の全員を締め出しているかを、1文で言いましょう。
ラボの検査は、ユーザー、フォルダ、cron の仕事、サービスを採点します。このレッスンは採点しません。上の課題が、このレッスンの検査される課題です。