Linux × Security設定の適正化編 ~ユーザ/運用管理~
目次
はじめに
クラウドインテグレーション部の渡邊です。
本記事のシリーズでは、サーバの構築・運用に最低限必要なセキュリティの体系的知識習得を目的としています。
本シリーズの全体像と今回執筆の内容の位置づけは以下の通りです。
- 設定の適正化
- ソフトウェア管理
- ユーザ管理 ←今回はここについて説明
- 運用管理 ←今回はここについて説明
- パケットフィルタリング
- 権限の制御
- 暗号化
- 検知
本内容はLinuxセキュリティ標準教科書に準拠しており、設定の適正化の観点でセキュリティチェック項目表に沿って内容を紹介していきます。
※灰色にマスクされている内容は別の記事で関連する内容を紹介するため割愛しております。
引用元:「Linuxセキュリティ標準教科書」 特定非営利活動法人エルピーアイジャパン p.13
環境
Amazon Linux 2
ユーザ管理
1.1 不要なユーザは、ログインできなくするか、削除する
1つ目は不要なユーザをログイン不可にするか削除することです。
これは不要なユーザによるセキュリティインシデントを防ぐために行います。 不要なユーザが多いほど情報漏洩のリスクが高まるため、ログイン不可にするか削除する対策を推奨します。
ユーザの基礎知識
ユーザの一覧は/etc/passwd
で確認ができます。
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
-略-
出力結果に:
で区切られているものが出力されています。
各項目についての説明は以下の通りです。
項目 | rootユーザの例 | 説明 |
---|---|---|
ユーザ名 | root | ユーザのログイン名 |
パスワード | x | 以前はパスワードが記述されていた項目 ※現在は /etc/shadow に暗号化されたパスワードが記載されているため、この部分は固定文字列 X と表示されています |
ユーザID(UID) | 0 | ユーザ固有の数字による識別子(UID) |
グループID(GID) | 0 | ユーザのプライマリーグループの数値識別子(GID) |
ユーザ情報 | root | ユーザのフルネームや役職など、ユーザに関する追加情報 |
ホームディレクトリ | /root | ユーザのホームディレクトリへの絶対パス |
シェル(Shell) | /bin/bash | ユーザのデフォルトシェルへの絶対パス |
また、新規ユーザ作成時には予約uidgidに注意します。 AmazonLinux2の場合は予約uidgidを以下の通り確認できました。
$ cat /usr/share/doc/setup*/uidgid
NAME UID GID HOME SHELL PACKAGES
root 0 0 /root /bin/bash setup
bin 1 1 /bin /sbin/nologin setup
daemon 2 2 /sbin /sbin/nologin setup
sys - 3 - - setup
adm 3 4 /var/adm /bin/bash setup
tty - 5 - - setup
disk - 6 - - setup
lp 4 7 /var/spool/lpd /sbin/nologin setup
mem - 8 - - setup
kmem - 9 - - setup
wheel - 10 - - setup
cdrom - 11 - - setup
sync 5 (0) /sbin /bin/sync setup
shutdown 6 (0) /sbin /sbin/shutdown setup
halt 7 (0) /sbin /sbin/halt setup
mail 8 12 /var/spool/mail /sbin/nologin setup
news 9 13 /var/spool/news /sbin/nologin setup
uucp 10 14 /var/spool/uucp /sbin/nologin uucp
operator 11 (0) /root /sbin/nologin setup
games 12 (100) /usr/games /sbin/nologin setup
gopher 13 30 /var/gopher /sbin/nologin -(not created by default)
ftp 14 50 /var/ftp /sbin/nologin setup
man - 15 - - setup
-略-
RedHatの資料の章Reserved User and Group IDsを参考にすると、新規ユーザを作成する際は予約済みのID 1000以下の数字を避け、予約範囲の拡大を加味して5000からUIDを割り当てることが望ましいようなのでその点に留意して新規ユーザを作成するとよいと思います。
実際に予約IDのUIDで新規ユーザ作成を試みました、ポイントは以下の通りです。
- 予約IDで新規ユーザを作成することに成功する。しかし、システムユーザを作成する際にUID重複エラーが発生するので予約IDで新規ユーザを作成しないほうがいい。例えば、test-userを予約ID 17(厳密には
/etc/login.defs
に設定のUIDの範囲外)で作成できるが警告が出る。
$ sudo useradd -m test-user -u 17
useradd warning: test-user's uid 17 outside of the UID_MIN 1000 and UID_MAX 60000 range.
- 予約IDであるかに関わらず重複するUIDを割り当てることは基本的にできない(
--non-unique
オプションをつければ作成可能)。例えば、既に作成されているUID 14を新規ユーザtest-user
に割り当てるとエラーが発生して作成できない。
$ sudo useradd -m test-user -u 14
useradd: UID 14 is not unique
ユーザアカウントのロックと削除をやってみる
まずはユーザアカウントのロックを実際にやってみると正しいパスワードを入力しても認証に失敗しました。 ロックしたユーザはアンロックすることで通常通り使えるようになるので必要なら戻しましょう。
また、不要であればuserdel
コマンドでユーザを削除してください、その際にホームディレクトリも同時に削除する-r
オプションを指定することをおすすめします。
#通常は切り替えられることを確認
[ec2-user@ip-172-31-9-27 ~]$ su - test-user
Password:
[test-user@ip-172-31-9-27 ~]$ exit
logout
#ユーザアカウントをロックしてパスワード認証によるユーザ切り替えの失敗を確認
[ec2-user@ip-172-31-9-27 ~]$ sudo passwd -l test-user
Locking password for user test-user.
passwd: Success
[ec2-user@ip-172-31-9-27 ~]$ su - test-user
Password:
su: Authentication failure
#ロックしたユーザアカウントをアンロックすることで再び切り替えられることを確認
[ec2-user@ip-172-31-9-27 ~]$ sudo passwd -u test-user
Unlocking password for user test-user.
passwd: Success
[ec2-user@ip-172-31-9-27 ~]$ su - test-user
Password:
Last login: Wed Jul 12 02:48:49 UTC 2023 on pts/2
Last failed login: Wed Jul 12 02:49:22 UTC 2023 on pts/2
There was 1 failed login attempt since the last successful login.
#不要なユーザであるためホームディレクトリごと削除
[ec2-user@ip-172-31-9-27 ~]$ sudo userdel -r test-user
1.2 必要に応じてユーザのパスワードに有効期限をつける
2つ目はパスワード漏洩リスクの軽減です。パスワードの長さと変更頻度に関して考慮する必要があるでしょう。
- パスワードの長さ
- パスワードが短いと、パスワード総当たり攻撃や辞書を使ったキーワードによる攻撃を受けてしまう可能性が高いです。 仮にパスワード変更しても同様に攻撃が成功してしまう確率は依然高いため、長いパスワードにするべきです。
- パスワードの変更頻度
- パスワードを長い期間変えないと攻撃が成功してしまう恐れがあります。一方で、有効期限が短いとユーザはログインを簡単にできるように短いパスワードにしたりメモを取ることによる流出などデメリットが有るため適切な頻度を設定する必要があります。 IPAはパスワードポリシーを定めているのでそちらもぜひ参考にしてください。抜粋すると以下の内容が挙げられていました。
最低でも10文字以上の文字数で構成されている。 パスワードの中に数字や、「@」、「%」、「"」などの記号も混ぜている。 パスワード内のアルファベットに大文字と小文字の両方を入れている。 サービスごとに違うパスワードを設定している。
※SSH接続の場合、システム突破のリスクを下げるために鍵によるユーザ管理が主流のためユーザにパスワードを設定する機会はあまりないです。
ユーザのパスワード設定を確認してみると、このようにいくつかの項目が表示されます。
$ sudo chage -l ec2-user
Last password change : Jun 06, 2023
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
各項目についての説明は以下の通りです。これらの設定項目を把握した上で、顧客と相談して更新頻度を検討するとよいと思います。
項目 | 値の例 | 説明 |
---|---|---|
Last password change | Jun 06, 2023 | ユーザのパスワードが最後に変更された日 |
Password expires | never | ユーザのパスワードが失効する日付 ※例の場合、「never」なので、パスワードは失効しない。 |
Password inactive | never | パスワードが無効になった日からユーザIDが無効になるまでの日数 |
Account expires | never | ユーザアカウントの有効期限が切れる日 |
Minimum number of days between password change | 0 | ユーザが再びパスワードを変更できるようになるまでの最短日数 ※例の場合、「0」なのでいつでも変更できる |
Maximum number of days between password change | 99999 | ユーザのパスワード失効までの最大日数 ※例の場合、「99999」なので期限切れにならない。また、この設定値はPassword expiresに反映される |
Number of days of warning before password expires | 7 | パスワードの有効期限が切れるまでの警告の日数 |
1.3 su / sudo を使えるユーザを制限する
3つ目は、su
コマンドやsudo
コマンドの制御です。 su
によって、他のユーザに切り替えることができます。このコマンドで特権ユーザにログインすることができます。 sudo
によって、特権ユーザとして指定したコマンドを実行することができます。 ユーザアカウントが不正利用された際にシステムが乗っ取られる危険を軽減するため、これらのコマンドは制限する必要があります。
su
およびsudo
コマンドの制限に関連する代表的な設定ファイルを以下に示します。
コマンド/グループ | ファイル | 説明 |
---|---|---|
su コマンド |
/etc/pam.d/su |
suコマンドに関連するPAMの設定を格納するファイル。認証プロセスを制御する。 |
sudo コマンド |
/etc/pam.d/sudo |
sudoコマンドの実行時に使用されるPAMの設定を含むファイル。認証ルールやポリシーを指定する。 |
/etc/sudoers |
sudoコマンドの設定ファイル。特権ユーザのアクセス制御ルールや許可されるコマンドを定義する。 | |
/etc/sudoers.d |
sudoコマンドの設定を追加またはオーバーライドするためのディレクトリ。個別の設定ルールを格納する。 | |
wheelグループ | /etc/group |
グループの情報を格納するファイル。sudoコマンドの実行に必要な特権グループとしてwheelグループがある |
/etc/pam.d/
配下のファイルでsu
コマンドやsudo
コマンドをPAM(特権アクセス管理)で制限します。 /etc/sudoers
でsudo
コマンドの使える範囲を制限します。
また、/etc/sudoers
は非常に重要なファイルのため、vi
コマンドではなく、visudo
コマンドを推奨します。visudo
コマンドを使用することで、複数の同時編集に対してsudoers
ファイルをロックし、基本的な構文チェックをしてくれます。
実際に、やってみます。
su
コマンドの制御
/etc/pam.d/su
の#auth required pam_wheel.so use_uid
のコメントアウトを解除して以下のようにします。 これでwheelグループに属しているユーザのみ su
コマンドが出来るように設定変更されました。
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
この時点ではec2-user
がwheelグループに属しているため、su
コマンドを使って新規ユーザtest-user
にログインできます。
[ec2-user@ip-172-31-9-27 ~]$ su - test-user
Password:
Last login: Wed Jul 12 04:56:19 UTC 2023 on pts/2
[test-user@ip-172-31-9-27 ~]$
/etc/group
のwheel:x:10:ec2-user
のec2-userを消します。以下の通りになっていればOKです。
$ cat /etc/group | grep wheel
wheel:x:10:
ec2-user
が作成したユーザに変更できないことを確認できました。 ec2-user
がwheelグループに属していないためsu
コマンドの実行に失敗しました。
$ su - test-user
Password:
su: Permission denied
sudo
コマンドの制御
新規ユーザtest-user
でsudo
コマンドを使用するとエラーが発生します。
$ sudo ls
test-user is not in the sudoers file.
/etc/sudoers
のroot ALL=(ALL) ALL
の下に test-user ALL=(ALL) ALL
を追加することでエラーは出なくなります。
-略-
root ALL=(ALL) ALL
test-user ALL=(ALL) ALL
-略-
それぞれの項目の意味は以下の通りです。
項目 | 説明 |
---|---|
root | ルールが適用されるユーザです。 |
ALL | ルールが適用されるホストです。 |
(ALL) | コマンドを実行するユーザまたはグループです。 |
ALL | ユーザが実行することを許可されたコマンドです。 |
運用管理
2.1 ランレベルを適切に設定し、不要なデーモンを起動させない
1つ目は不要なデーモンの起動を制御することです。 デーモンを起動させることで以下のデメリットがあります。
- 使わないはずのポートが開いていることによる攻撃リスク
- CPU などのリソースを無駄に消費
RHEL7以降やAmazon Linux2では、プロセスを管理する仕組みとしてinitdを廃止し起動ターゲット(systemd)を採用しました。 それぞれの以下の方式でプロセスをコントロールします。
- initd・・・ランレベルの設定でデーモンの自動起動をコントロール
- Systemd・・・各デーモンの自動起動をコントロール
よって、initdで使用したランレベルをsystemdでは使用しません。
Systemd補足
Systemdには以下の特徴があります。
- Linux の起動処理 (init) やユニットの管理を行うソフトウェア群
- ユニットのタイプとして、「target」「mount」「service」 などがある
- 各ユニットでプロセスの起動を制御できる
- 並列でユニットを起動するので素早い
- ターゲットはinitdのランレベルに対応している
ランレベル/ターゲットユニット対応表
ランレベル | ターゲットユニット | 説明 |
---|---|---|
0 | runlevel0.target,poweroff.target | システムをシャットダウンして、電源を切断 |
1 | runlevel1.target,rescue.target | レスキューシェルを設定 |
2 | runlevel2.target,multi-user.target | 非グラフィカルなマルチユーザシステムを設定 |
3 | runlevel3.target,multi-user.target | 非グラフィカルなマルチユーザシステムを設定 |
4 | runlevel4.target,multi-user.target | 非グラフィカルなマルチユーザシステムを設定 |
5 | runlevel5.target,graphical.target | グラフィカルなマルチユーザシステムを設定 |
6 | runlevel6.target,reboot.target | システムをシャットダウンして再起動 |
※runlevelX.targetは右側のターゲットのシンボリックリンクです
2.2 ログを正確に残す
2つ目はログを正確に残すことです。障害などが発生したときに原因や起こったことを把握するためログを確認します。 ログを正確に残さないと原因の究明が困難になるため、正確に残すようにする必要があります。
ログの設定に関しては以下2点に注意してください。
- ディスク容量を圧迫しないようにログをローテーションすること
- ログは一つ一つのデータは小さいですが数が膨大になるため、定期的にログを圧縮したり、外部サーバに送ったり、古いログを削除するなど容量を圧迫しないように工夫が必要です
- ログの時刻を正確にするためにサーバの時刻を正確にする
- ログを参照する際に、時刻が正確でないと障害を特定するのが困難になるため、ntpサーバを正しく設定したり、タイムゾーンを想定のものに設定する必要があります
まとめ
今回はソフトウェア管理の設定の適正化で以下観点を説明しました。
- ユーザ管理
- 不要なユーザは、ログインできなくするか、削除する
- 必要に応じてユーザのパスワードに有効期限をつける
- su / sudo を使えるユーザを制限する
- 運用管理
- ランレベルを適切に設定し、不要なデーモンを起動させない
- ログを正確に残す
次回の記事ではパケットフィルタリングについて執筆予定です。ぜひそちらも御覧ください!
【参考】
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。