【第13回】情報セキュリティの雪山(1) ~パスワードの強化~

 皆さま,こんにちは. 迷子のエンリュです.

 前回まではsudoやらsuやらの設定をしながら,LinuxCUIベースでいろいろと動かす練習をしました.今回からは本格的にセキュリティ強化を行っていきます.面倒に思うかもしれませんが,これも早くネットワークに接続するためです.

 あなたの開発環境が攻撃者に利用されてしまうことのないよう,しっかりと設定していきましょう.それではよろしくお願いします.

目次

はじめに

 Linuxは,無料で手に入るOSであるがゆえに,攻撃者も簡単にセキュリティホールを研究できてしまうという弱点があります.これまで「Linuxはあまり攻撃対象になっていないから大丈夫」ということがたくさん言われてきましたが,クラウドコンピューティングが普及し,Windowsサーバーと同じくらいLinuxサーバーが動いているこの時代,そんなことも言っていられません.また,IoTの増加に伴うDDoS攻撃の脅威も考えないわけにはいきません.これは個人で動かしているIoT機器も利用されてしまいますから,個人運用でひっそりと楽しんでいる人も情報セキュリティの確保の責任が問われるのです.

 ただネットワークに接続するだけでもそれなりに危険だということを認識する必要があります.情報技術を趣味として使えるようになった時代だからこそ,ひとりひとりが情報セキュリティを意識すべきなのです.

 前回行ったsuコマンドの権限の設定も,情報セキュリティを向上させる大切な作業です.root権限を簡単に使われないようにすることは基本中の基本です.ただし,それだけでは実は十分ではありません.攻撃者は様々な攻撃手段を日々研究しています.私たちも,いくつもの防御・防護手段を講じて,何重にもセキュリティのを立てておく必要があるのです.

パスワードの強化

 パスワードの強化は,セキュリティを向上させる大切な手段です.個人レベルでは強力なパスワードを用いたり,定期的にパスワードを変更するよう意識するくらいしかありませんが,管理者レベルでは,ユーザのパスワードレベルを保つための様々な対策を施すことができます.

パスワードに関わる脅威

 そもそも,パスワードは日ごろどのような危険に晒されているのか,少しまとめてみましょう.

脅威 概要 対策
盗聴 通信路に入力したパスワード文字列が流れると,その都度盗聴される可能性がある. 適切な暗号化
ショルダーハッキング パスワードを入力する際に覗き見られたり,メモとして書き残したものを見られるなどして,アカウントを利用されてしまう. 定期的な更新
他人への譲渡 やむを得ない事情でID/パスワードを他人に教えてしまう.正当な理由がなければ不正アクセス禁止法違反となってしまう. 適切なパスワード管理,定期的な更新
パスワードクラッキング 総当たり攻撃,辞書攻撃,パスワードリスト攻撃などでパスワードを解除されてしまう.辞書に載っている単語を使う,8文字以下のパスワード,よく用いられるパスワードなどの場合はすぐに破られてしまう. 強力なパスワード
平文のパスワード管理 通常パスワードは暗号化されて保存されるが,自作のログインシステムなどの場合は,平文で保存されたり,通信されたりというケースも起こりうる. 適切な暗号化
内部からのパスワード漏洩 パスワードがユーザから見られるファイルに記録されていると,暗号化されていても総当たり攻撃などでパスワードを破られる可能性がある. シャドウパスワード
サイドチャネル攻撃 システムが発するノイズやCPUの稼働状況など,通常の通信盗聴手段と異なる方法で盗聴される危険性もある.パスワードの流出なども考えられる. 適切な暗号化,定期的な更新,その他不正アクセス対策

 以上,すぐに思いつくものだけでもこれだけありますが,対策の項を見ていただければわかる通り,普段からパスワードのセキュリティについて気を付けていれば,ある程度防げるものでもあります.

 ここでは,パスワードのセキュリティを強化させるのに有効な,以下のことを扱っていきます.

  • シャドウパスワードの設定 パスワードが一般ユーザに見えないようにします.
  • パスワードポリシーの設定 パスワードの強度や更新頻度などを指定します.
  • 暗号化アルゴリズムの設定 強力な暗号化アルゴリズムに変更します.

    これでかなりセキュリティは強化されるはずですね.早速やっていきましょう.

シャドウパスワードの設定

 シャドウパスワードは,一般ユーザから暗号化されたパスワードを見えなくしたものです.従来,ユーザーのアカウント情報はpasswdファイルにすべて記載されていました.このファイルは一般ユーザ権限で見られるものです.ユーザー名と暗号化されたパスワードを,誰でも調べることができました.しかし,暗号化されているとはいえ,あり得そうなパスワードを片っ端から同じ手法で暗号化して比較していけば,パスワードを特定することができてしまうため,これはとても危険でした.

 そこで,passwdファイルのパスワードの部分を隠し,ユーザー認証などの際に暗号化パスワードを調べるファイルとして,root権限がなければ見られないshadowファイルを新たに用意する方法が生まれました.これがシャドウパスワードです.

確認方法

 passwdもshadowもテキストファイルなのでファイル閲覧コマンドで見ることもできますが,これらはgetentコマンドで表示させるのが一般的です.

# /etc/passwdのユーザー名やそれぞれの設定の一覧を表示.
$ getent passwd
# 特定のユーザーを抜き出して表示.
$ getent passwd USERNAME

f:id:LostEnryu:20161103131359p:plain

 「:」区切りでユーザー名,パスワード,uid,gid,...と並んでいます.パスワードの欄が「x」という文字に置き換わっていたらシャドウパスワードが有効になっている証拠です.shadowファイルの方も確認してみると,暗号化されたパスワードが記載されています.

# /etc/shadowを表示
$ sudo getent shadow enryu
enryu:$1$********:17089:0:99999:7:::

 ********の部分が暗号化パスワードであり,その前の数字は暗号化アルゴリズムの種類を表しています.また,そのあとにはパスワードに関する設定などが続いています.

設定方法

 もしシャドウパスワードになっていなかったり,解除してしまったときには有効化する必要があります.シャドウパスワードを有効にするには,pwconvコマンドを使います.詳しくは$ man pwconvで調べられます.

# シャドウパスワードの有効化
$ sudo pwconv
# シャドウパスワードの無効化
$ sudo pwunconv

パスワードポリシーの設定

パスワードポリシーとは

 パスワードポリシーとは,パスワードの設定や更新に関する決まりのことで,PAMで設定するものとlogin.defsで設定するものがあります.以下の項目があります.

設定方法 項目 意味・概要 例(デフォルト値)
login.defs PASS_ALWAYS_WARN パスワードが弱いと警告します. yes(no)
login.defs PASS_MAX_DAYS 同じパスワードを使える最大日数です. 180(99999)
login.defs PASS_MIN_DAYS パスワードを変更してから,次に変更できるようになるまでの最小日数です. 1(0)
login.defs PASS_WARN_AGE パスワードの期限が切れる何日前から警告するかです.マイナスは警告しません. 7(7)
PAM minlen パスワードの最小文字数です. 8(4)
PAM remember パスワードを過去何世代と異なるものにするかを指定します. 3()
PAM deny パスワード入力を何回間違えたらアカウントをロックするかを指定します. 5()
PAM unlock_time アカウントをロックする時間(秒)を指定します. 180()
PAM minclass パスワードに最低限含めるべき文字の種類(数字,大文字,小文字,記号)の数を指定します. 3(0)
PAM maxsequence '12345', 'abcde'などの連続した並びが何文字以上続いたらパスワードを破棄するかを指定します. 4(0)
PAM dcredit, ucredit, lcredit, ocredit パスワードに含める文字の種類と文字数などを指定します(※). 0(1)

※dcreditは数字,ucreditは大文字,lcreditは小文字,ocreditは記号などを表します.これらの振る舞いは少々複雑です.例えば(case 1)dcredit=2, minlen=8のとき,数字が1つ含まれていたらパスワードが7文字でも許可します.これを2文字まで許すので,実質パスワードの長さは6文字以上となります.ただし,数字が含まれていなければ8文字以上ということです.(case 2)dcredit=-2, minlen=8のとき,数字が2文字以上含まれていないと許可されません.また,数字が含まれていた場合,minlenには影響しません.(case 3)creditを何も設定せず,minlen=8のとき,creditのデフォルト値は1となります.数字,大文字,小文字,記号などをすべて含めると,minlenは4になりますが,実際は5文字以下のパスワードは弾かれるため,6文字が最小文字数となります.厳密にminlenを設定したいときは,?creditを0以下に設定すべきです.

パスワードポリシーの設定

 では実際に設定していきましょう.これからやるのはあくまで一例です.数値などはご自身で決めたものに適宜変えてください.

 まずはlogin.defsです.ここでは編集にviを使っていますが,もちろんお好きなテキストエディタで構いません.画像のようにデフォルトでパスワードに関する設定が書かれている場所がありますので,変更していきます.

$ sudo vi /etc/login.defs

f:id:LostEnryu:20161103131226p:plain

PASS_MAX_DAYS    180
PASS_MIN_DAYS    1
PASS_MIN_LEN    8        # PAMの設定が優先されるのであまり意味はありません
PASS_WARN_AGE    7

 次はPAMsystem-authです.

$ sudo vi /etc/pam.d/system-auth

f:id:LostEnryu:20161103131246p:plain

 ここにどんどん書き足していきます.心配な人はバックアップを取っておいてもいいでしょう.ファイルが大きくて分かりにくいかもしれないので,編集ポイントをまとめます.なお,行数は:set numberで表示できます.

  1. 8行目の下に auth required pam_tally2.so deny=5 unlock_time=180 を挿入
  2. 17行目 password requisite pam_cracklib.so にminlen=8 minclass=3 maxsequence=4 dcredit=-1 ucredit=0 lcredit=0 ocredit=0を追加
  3. 18行目 password required pam_unix.so にremember=3を追加

f:id:LostEnryu:20161103131305p:plain

 これで設定は終了です.:wqで保存して終了しましょう.

ユーザごとの設定

 上で設定した項目のうちのいくつかは,chageコマンドで確認したり,変更したりできます.

$ chage -l enryu
Last password change            : Nov 02, 2016
Password expires            : May 01, 2017
Password inactive            : never
Account expires            : never
Minimum number of days between password change    : 0
Maximum number of days between password change    : 180
Number of days of warning before password expires    : 7

 変更するときは次のオプションを使います.

オプション 項目 意味
-m mindays パスワードを変更してから次に変更できるようになるまでの最小日数を変更
-M maxdays 同じパスワードを使用できる最大日数を変更
-W warndays パスワードの期限が切れる警告を何日前から行うかを変更

 このコマンドを使用して,各ユーザーごとに設定を変更することができます.

# 例:ユーザenryuのパスワード更新最小日数を0にする
$ sudo chage -m 0 enryu

 他のオプションについては次回お話しします.

暗号化アルゴリズムの設定

暗号化アルゴリズムの種類

 パスワードを暗号化するアルゴリズムにはいろいろ種類があります.ひと昔前は標準的な暗号方式の規格であるDESが一般的でした.今使っているCentOS6.8ではMD5によるハッシュ化が用いられています.

 しかし,DESは8文字までのパスワードしか扱えず,MD5脆弱性が発見されてパスワードを破られる可能性が出てきたため,CentOS7からはSHA-2というハッシュ化方式が取られています.

 暗号化アルゴリズムの方式は,時代を経るにしたがってまだまだ移り変わっていくでしょう.そのたびに新しい方式へと設定を直していく必要があるのです.

 ここでは,SHA-2のひとつ,SHA512という方式に設定しましょう.

 再びPAMのsystem-authを変更します.

# cオプションは起動時にコマンドを実行する
$ sudo vi /etc/pam.d/system-auth -c "set number"
    :
18 password sufficient pam_unix.so MD5 shadow nullok remember=3 try_first_pass use_authtok
↑この行のMD5をSHA512に変更↓
18 password sufficient pam_unix.so SHA512 shadow nullok try_first_pass use_authtok
    :

設定の反映

 以上でパスワードに関する設定が完了したわけですが,このままでは設定は反映されません.設定の仕方によって,反映されるタイミングは様々です.

login.defsの設定の反映

 login.defsで設定した内容は,useraddで新しくアカウントを作るか,pwconvでshadowファイルを作り直すときに反映されます.useraddの場合は,既存のアカウントへは反映されないので,pwconvしなおすのが良いでしょう.

# pwconvしなおす場合
$ sudo pwunconv
$ sudo pwconv
# 確認
$ chage -l USERNAME

 なおchageによる設定はその場で反映されます.

PAMの設定

 PAMで設定したパスワードポリシーや,パスワードの暗号化方式は,新たにパスワードを発行するときに有効になります.したがって,既存のパスワードは以前の暗号化形式のままになっています.したがって,各ユーザが次回ログインするときに,パスワードを変更させる必要があります.

# 自分で行う場合
$ passwd
# 次回ログイン時にUSERに変更させる場合
$ passwd -e USER

 以上でパスワードの強化は完了です.次回はセキュアなアカウント管理について勉強していきます.よろしくお願いします.

参考ページ

セキュリティ対策は急がず慌てず迅速に

 今回の内容はこちらの記事でも扱っています.

Previous Top Next
【第12回】 Journey 【第14回】
目指せLinuxマスター(4) ~suの権限~ Index 情報セキュリティの雪山(2) ~セキュアなアカウント管理~