110.1 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
110 セキュリティ |
Objective: |
110.1 セキュリティ管理タスクを実行する |
Lesson: |
1 of 1 |
はじめに
システム管理ではセキュリティへの配慮が欠かせません。ファイルの特別なパーミッション、ユーザーのパスワード、開いているポートとソケット、システムリソースの制限、ログインしているユーザーの把握、su
と sudo
による権限昇格など、気をつけなければならないことがたくさんあります。このレッスンでは、これらのセキュリティに関する留意事項を概観します。
SUIDとSGIDが設定されたファイルを確認する
Linuxシステムのファイルには、読み書き実行 という通常のパーミッションに加えて、SUID と SGID という特別なパーミッションがあります。
SUIDが設定されたファイルは、所有者の権限で実行されます。数値表記では 4000
、記号表記では所有者の 実行 パーミッションの有無に応じて s
ないし S
で表されます。SUIDパーミッションが設定されているファイルの代表例は passwd
です。(訳注:ディレクトリにSUIDを設定しても何も起きません。)
carol@debian:~$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 63736 jul 27 2018 /usr/bin/passwd
所有者に対するパーミッション rws
の小文字の s
が、所有者の 実行 パーミッションとSUIDの両方が設定されていることを示しています。大文字の S
なら所有者の 実行 パーミッションがなく、SUIDのみが設定されていることを意味します。
Note
|
次節で詳しく説明しますが、 |
SGIDはファイルとディレクトリのどちらにでも設定できます。ファイルに設定すると、そのファイルの所有グループの権限で実行されるようになります。これはSUIDと似ています。ディレクトリに設定すると、そのディレクトリ内に作成したファイルの所有グループが、そのディレクトリの所有グループと同じになります。SUIDと同様に、記号表記では所有グループの 実行 パーミッションの有無に応じて s
ないし S
で表されます。数値表記では 2000
で表されます。
chmod
で既存のディレクトリにSGIDを設定できます。数値表記なら、通常のパーミッションを表す3桁の数字の先頭に 2
を付け足します。以下の例では、パーミッションが 755
のディレクトリにSGIDを設定しています。
carol@debian:~$ ls -ld shared_directory drwxr-xr-x 2 carol carol 4096 may 30 23:55 shared_directory carol@debian:~$ sudo chmod 2755 shared_directory/ carol@debian:~$ ls -ld shared_directory drwxr-sr-x 2 carol carol 4096 may 30 23:55 shared_directory
SUIDとSGIDの一方あるいは両方が設定されているファイルを検索するには、find
コマンドの -perm
オプションを使います。数値表記でも記号表記でも検索できます。そのまま、-
(ダッシュ)付き、/
(スラッシュ)付きの3通りの検索方法があります。それぞれの検索方法の意味は次のとおりです。
-perm 数値表記
または、-perm 記号表記
-
指定したパーミッションに一致するファイルを検索します。
-perm -数値表記
または、-perm -記号表記
-
少なくとも指定したパーミッションが全部あるファイルを検索します。
-perm /数値表記
または、-perm /記号表記
-
指定したパーミッションのうち1つでも設定されているファイルを検索します。
例えば、現在の作業ディレクトリからSUID だけ が設定されているファイルを検索するなら、次のコマンド(find . -perm 4000
)を実行します。
carol@debian:~$ find . -perm 4000 carol@debian:~$ touch file carol@debian:~$ chmod 4000 file carol@debian:~$ find . -perm 4000 ./file
最初にfindコマンドを実行したときにはSUIDだけが設定されているファイルは存在しなかったので、検索結果が表示されるようにSUIDだけが設定されているファイルを作ってみました。記号表記でも同じように検索できます。
carol@debian:~$ find . -perm u+s ./file
/usr/bin/
ディレクトリからSUIDが設定されているファイル(他のパーミッションはどうなっていてもよい)を検索するなら、次のコマンドを実行します。数値表記でも記号表記でも動作は同じです。
carol@debian:~$ sudo find /usr/bin -perm -4000 /usr/bin/umount /usr/bin/newgrp /usr/bin/gpasswd /usr/bin/chfn /usr/bin/mount /usr/bin/passwd /usr/bin/chsh /usr/bin/sudo /usr/bin/su carol@debian:~$ sudo find /usr/bin -perm -u+s /usr/bin/umount /usr/bin/newgrp /usr/bin/gpasswd /usr/bin/chfn /usr/bin/mount /usr/bin/passwd /usr/bin/chsh /usr/bin/sudo /usr/bin/su
SGIDが設定されているファイル(他のパーミッションはどうなっていてもよい)を検索するなら、find /usr/bin/ -perm -2000
か find /usr/bin/ -perm -g+s
を実行します。
SUIDとSGIDのいずれか一方でも設定されているファイルを検索するなら、/
を使います(/6000
の 6
はSUIDの 4
とSGIDの 2
を足した 6
です)。
carol@debian:~$ sudo find /usr/bin -perm /6000 /usr/bin/dotlock.mailutils /usr/bin/umount /usr/bin/newgrp /usr/bin/wall /usr/bin/ssh-agent /usr/bin/chage /usr/bin/dotlockfile /usr/bin/gpasswd /usr/bin/chfn /usr/bin/mount /usr/bin/passwd /usr/bin/chsh /usr/bin/expiry /usr/bin/sudo /usr/bin/bsd-write /usr/bin/crontab /usr/bin/su
パスワードを管理する
先に述べたように、passwd
で一般ユーザーも自分自身のパスワードを変更できます。-S
ないし --status
オプションを指定すると、自分のユーザーアカウントについての情報を得られます。
carol@debian:~$ passwd -S carol P 12/07/2019 0 99999 7 -1
出力される7つのフィールドを説明します。
carol
-
ユーザー名です。
P
-
P
はそのユーザーが有効なパスワードを設定していることを示します。L
はパスワードがロックされていることを、NP
はパスワードを設定していないことを示します。 12/07/2019
-
最後にパスワードを変更した日付です。
0
-
パスワード変更不可能期間(パスワードを変更してから次に変更するまでの最小期間)です。単位は日です。
0
はいつでもパスワードを変更できることを意味します。(訳注:ユーザーがパスワードを変更してすぐに前のパスワードに戻すことを防ぐために設定することがあります。) 99999
-
パスワード有効期間です。単位は日です。
99999
はパスワードが失効せず無期限で有効であることを意味します。 7
-
パスワード失効前警告期間(パスワードの有効期間が終了して失効するどれくらい前に警告を受けるか)です。単位は日です。
-1
-
パスワード無効化期間(パスワードの有効期間が終了して失効してからユーザーアカウントがロックされるまでの期間)です。単位は日です。
-1
はユーザーアカウントをロックしないことを意味します。
rootユーザーで passwd
コマンドを実行すると、ユーザーアカウントのパスワードを管理できます。-l
オプションを指定してパスワードをロックする、-u
オプションを指定してパスワードのロックを解除する(アンロック)、-e
オプションを指定してパスワードを失効させ次回ログイン時にパスワードの変更を強制する、-d
オプションを指定してパスワードを削除する、といった具合です。
これらのオプションを試してみるために、ここで su
(Substitute User)コマンドを紹介します。su
コマンドを実行すると、ユーザーを変更した新しいシェルを起動します。rootユーザーとして passwd
コマンドを実行して carol
のパスワードをロックし、ユーザーを carol
に切り替えてパスワードがロックされていて(L
と表示されていて)変更できないことを確認し、rootユーザーに戻って carol
のパスワードのロックを解除するという例を示します。
root@debian:~# passwd -l carol passwd: password expiry information changed. root@debian:~# su - carol carol@debian:~$ passwd -S carol L 05/31/2020 0 99999 7 -1 carol@debian:~$ passwd Changing password for carol. Current password: passwd: Authentication token manipulation error passwd: password unchanged carol@debian:~$ exit logout root@debian:~# passwd -u carol passwd: password expiry information changed.
パスワードのロックとロックの解除(アンロック)は、usermod
コマンドでもできます。
carol
のパスワードをロックするコマンド-
usermod -L carol
またはusermod --lock carol
carol
のパスワードのロックを解除するコマンド-
usermod -U carol
またはusermod --unlock carol
Note
|
|
パスワードの有効期間を passwd
や usermod
より直接扱うコマンドは chage
(CHange AGE)です。rootユーザーとして、-l
(--list
)オプションとユーザー名を指定して chage
コマンドを実行すると、そのユーザーのパスワードに関する情報を出力します。一般ユーザーは自分自身の情報しか出力できません。
carol@debian:~$ chage -l carol Last password change : Aug 06, 2019 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
オプションを付けずにユーザー名だけ指定して chage
を実行すると、対話モードになります。
root@debian:~# chage carol Changing the aging information for carol Enter the new value, or press ENTER for the default Minimum Password Age [0]: Maximum Password Age [99999]: Last Password Change (YYYY-MM-DD) [2020-06-01]: Password Expiration Warning [7]: Password Inactive [-1]: Account Expiration Date (YYYY-MM-DD) [-1]:
パスワードに関する設定を変更する chage
のオプションは次のとおりです。
-m 日数 ユーザー名
または--mindays 日数 ユーザー名
-
パスワードを変更してから次にパスワードを変更できるまでの最小日数を設定します(例:
chage -m 5 carol
)。0
に設定するといつでもパスワードを変更できます。 -M 日数 ユーザー名
または--maxdays 日数 ユーザー名
-
1つのパスワード使用し続けることができる最長日数を設定します(例:
chage -M 30 carol
)。パスワードを失効させず無期限で有効にするには、99999
を設定します。 -d 日数 ユーザー名
または--lastday 日数 ユーザー名
-
最後にパスワードを変更してからの経過日数を設定します(例:
chage -d 10 carol
)。0
に設定すると次回ログイン時にパスワードの変更を強制します。 -W 日数 ユーザー名
または--warndays 日数 ユーザー名
-
パスワード失効の何日前から警告を行うかを設定します。
-I 日数 ユーザー名
または--inactive 日数 ユーザー名
-
パスワードの有効期間が切れてからアカウントがロックされるまでの日数を設定します(例:
chage -I 10 carol
)。usermod -f
ないしusermod --inactive
と同じです。設定した日数が経過する前にユーザーがログインしてパスワードを変更しないと、アカウントはロックされます。0
に設定すると、ユーザーアカウントをロックしません。 -E 日付 ユーザー名
または--expiredate 日付 ユーザー名
-
アカウントが無効となる日付(または UNIXエポック からの日数)を設定します。日付は
YYYY-MM-DD
というフォーマットで設定します(例:chage-E 2050-12-13 carol
)。
Note
|
|
開いているポートを検出する
開いているポートを監視するには、lsof
、fuser
、netstat
、nmap
の4つのユーティリティを使います。本節では、これらのユーティリティを1つずつ紹介します。
lsof
(LiSt Open Files)は、開いているファイルの一覧を表示します。Linuxではあらゆるものがファイルとして扱われますから、これはとても重要なことです。ターミナルで lsof
とだけ入力して実行すると、通常ファイル、デバイスファイル、ソケットなど、たくさんの結果が出力されるはずです。このレッスンではネットワークポートに焦点を絞ります。lsof
に -i
オプションを指定して実行すると、使用中のネットワークポートの一覧を表示します。(訳注:ネットワークポートはファイルではありませんが、ファイルの一種と見なすことができる ソケット と結びつけられて初めて利用可能となります。)
root@debian:~# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dhclient 357 root 7u IPv4 13493 0t0 UDP *:bootpc sshd 389 root 3u IPv4 13689 0t0 TCP *:ssh (LISTEN) sshd 389 root 4u IPv6 13700 0t0 TCP *:ssh (LISTEN) apache2 399 root 3u IPv6 13826 0t0 TCP *:http (LISTEN) apache2 401 www-data 3u IPv6 13826 0t0 TCP *:http (LISTEN) apache2 402 www-data 3u IPv6 13826 0t0 TCP *:http (LISTEN) sshd 557 root 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED) sshd 569 carol 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED)
DHCPで使用される bootpc
を別にすれば、2種類のサービスが接続を待ち受けていることが、この出力のLISTENという部分からわかります。ssh
とApacheウェブサーバー(httpd
)の2種類です。そして、2つのSSHセッションが確立していることが、ESTABLISHEDという部分からわかります。
root@debian:~# lsof -i@192.168.1.7 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 557 root 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED) sshd 569 carol 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED)
Note
|
|
-i
オプション(ないし -i@ip-address
オプション)に :port
引数を渡すと、そのポートに絞って表示できます。
root@debian:~# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 389 root 3u IPv4 13689 0t0 TCP *:ssh (LISTEN) sshd 389 root 4u IPv6 13700 0t0 TCP *:ssh (LISTEN) sshd 557 root 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED) sshd 569 carol 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED)
カンマ区切り(またはハイフンでの範囲)で複数のポートを対象にすることもできます。
root@debian:~# lsof -i@192.168.1.7:22,80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 705 root 3u IPv4 13960 0t0 TCP 192.168.1.7:ssh->192.168.1.4:44766 (ESTABLISHED) sshd 718 carol 3u IPv4 13960 0t0 TCP 192.168.1.7:ssh->192.168.1.4:44766 (ESTABLISHED)
Note
|
|
次に fuser
(File’s USER)を説明します。これはファイルのユーザー(どのプロセスがファイルを開いているか)を調べるために使います。ファイルをどのように利用しているかもわかります。例えば、現在の作業ディレクトリを調べるなら、fuser .
を実行します。-v
(--verbose
)オプションを指定して実行すると冗長な情報を得られます。
root@debian:~# fuser . /root: 580c root@debian:~# fuser -v . USER PID ACCESS COMMAND /root: root 580 ..c.. bash
出力について説明します。()内に該当する部分を示します。
- ファイル
-
調査対象のファイル(
/root
) USER
列-
そのファイルの所有者(
root
) PID
列-
プロセスID(
580
) ACCESS
列-
ファイルをどのように利用しているかを示すフラグ(
..c..
)c
-
カレントディレクトリ
e
-
実行中のファイル
f
-
開いているファイル(デフォルトでは表示されません)
F
-
書き込みのために開いているファイル(デフォルトでは表示されません)
r
-
ルートディレクトリ
m
-
共有ライブラリなど、メモリにマップされたファイル
.
-
プレースホルダー(デフォルトでは表示されません)
COMMAND
列-
ファイルにアクセスしているコマンド(
bash
)
-n
(--namespace
)オプションを指定すると、ネットワークポート/ソケットについて調べられます。ネットワークプロトコルとポート番号を引数として渡します。Apacheウェブサーバーについて調べるなら、次のコマンドを実行します。
root@debian:~# fuser -vn tcp 80 USER PID ACCESS COMMAND 80/tcp: root 402 F.... apache2 www-data 404 F.... apache2 www-data 405 F.... apache2
Note
|
|
次は netstat
を説明します。netstat
(NETwork STATistics)は、ネットワークの状態を幅広く調べられるツールです。
オプションを付けずに netstat
を実行すると、アクティブなインターネット接続とUnixソケットの情報を表示します。大量に出力されるでしょうから、パイプで less
につなげたほうがよいです。
carol@debian:~$ netstat |less Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.1.7:ssh 192.168.1.4:55444 ESTABLISHED Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ] DGRAM 10509 /run/systemd/journal/syslog unix 3 [ ] DGRAM 10123 /run/systemd/notify (...)
-l
(--listening
)オプションを指定すると、接続を待ち受けているポートとソケットだけを表示します。-t
(--tcp
)および -u
(--udp
)オプションを指定すると、それぞれTCPだけあるいはUDPだけを表示します(これらのオプションを同時に指定してTCPとUDPだけを表示することもできます)。-e
(--extend
)オプションを指定すると、表示される情報が増えます。
carol@debian:~$ netstat -lu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 0.0.0.0:bootpc 0.0.0.0:* carol@debian:~$ netstat -lt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN tcp6 0 0 [::]:http [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 localhost:smtp [::]:* LISTEN carol@debian:~$ netstat -lute Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN root 13729 tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN root 14372 tcp6 0 0 [::]:http [::]:* LISTEN root 14159 tcp6 0 0 [::]:ssh [::]:* LISTEN root 13740 tcp6 0 0 localhost:smtp [::]:* LISTEN root 14374 udp 0 0 0.0.0.0:bootpc 0.0.0.0:* root 13604
-l
オプションを指定しなければ、確立している接続だけを表示します。
carol@debian:~$ netstat -ute Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 192.168.1.7:ssh 192.168.1.4:39144 ESTABLISHED root 15103
-n
(--numeric
)オプションを指定すると、ポートとホストを名前ではなく番号とIPアドレスで表示します。-n
オプションを加えた下記の実行結果では、先ほどの実行結果で ssh
と表示されていた部分が 22
になっています。(訳注:ホスト名を表示するとDNS検索を行うので長い時間がかかりがちです。それを避けるためにとてもよく使うオプションです。)
carol@debian:~$ netstat -uten Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 192.168.1.7:22 192.168.1.4:39144 ESTABLISHED 0 15103
ここまでもそうしてきたように、オプションを組み合わせて netstat
を使うと便利です。必要に応じてマニュアルページを参照してください。(訳注:新しいディストリビューションでは、netstat
ではなく ss
コマンドを使用することが多いです。)
最後に nmap
(Network MAPper)を説明します。IPアドレスまたはホスト名を指定して実行すると、開いているポートをスキャンできます。
root@debian:~# nmap localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:29 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.0000040s latency). Other addresses for localhost (not scanned): ::1 Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.58 seconds
nmap
では、複数のホストのポートをスキャンできます。
- 複数のホスト
-
スペースで区切ります(例:
nmap localhost 192.168.1.7
) - ホスト範囲
-
ハイフンで範囲を指定します(例:
nmap 192.168.1.3-20
) - サブネット
-
ワイルドカードまたはCIDR表記を使います(例:
nmap 192.168.1.*
またはnmap 192.168.1.0/24
)。除外指定もできます(例:nmap 192.168.1.0/24 --exclude 192.168.1.7
)。
-p
オプションの後にポート番号ないしサービス名を指定すると、そのポートだけをスキャンします(nmap -p 22
と nmap -p ssh
は同じ結果になります)。
root@debian:~# nmap -p 22 localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:54 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000024s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
カンマで区切るかハイフンで範囲を指定すれば、複数のポートをスキャンできます。
root@debian:~# nmap -p ssh,80 localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:58 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000051s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
root@debian:~# nmap -p 22-80 localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:58 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000011s latency). Other addresses for localhost (not scanned): ::1 Not shown: 57 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.47 seconds
その他、nmap
には次のオプションがあります。
-F
-
よく使われる100のポートを迅速にスキャンします。
-v
-
冗長な出力を行います(
-vv
を指定するとさらに冗長な出力になります)。
Note
|
|
ユーザーのプロセスやメモリ使用量などを制限する
Linuxシステムのリソースは有限ですから、システム管理者は、OSが適切に動き続けるように、ユーザーが使用できるリソースを制限しなければならないことがあります。そのためには ulimit
コマンドを使います。
ulimit
に -S
オプションを指定すると ソフトリミット を、-H
オプションを指定すると ハードリミット を扱います。ハードリミット とはシステム管理者が設定するリミット値で、ソフトリミット とはユーザーごとに設定するリミット値です。ソフトリミットによるリミット値は、ハードリミットによるリミット値を超えることができません。(訳注:LPIC-1レベルではハードリミットを操作することはありません。)
オプションなしで ulimit
を実行すると、現在のユーザーのファイルブロック(シェルとその子プロセスが生成できるファイルの最大サイズ)のソフトリミットを表示します。
carol@debian:~$ ulimit unlimited
-a
オプションを指定して ulimit
を実行すると(-Sa
オプションを指定しても同じです)、現在のユーザーのすべてのソフトリミットを表示します。-Ha
オプションを指定するとすべてのハードリミット表示します。
carol@debian:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 (...) carol@debian:~$ ulimit -Ha core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 (...)
リソースを指定するには次のオプションを使います。
-b
-
ソケットバッファの最大サイズ
-f
-
シェルとその子プロセスが生成できるファイルの最大サイズ
-l
-
メモリにロックできる最大サイズ
-m
-
常駐セットサイズ(プロセスが確保している物理メモリの量、RSS)の最大値
-v
-
仮想メモリの最大量
-u
-
1人のユーザが使用できるプロセスの最大数
ulimit
の後に -S
ないし -H
と上記のリソースオプションを指定すると、そのリソースのソフトリミットないしハードリミットを表示します。-S
も -H
も指定しなければ、ソフトリミットを表示します。
carol@debian:~$ ulimit -u 10000 carol@debian:~$ ulimit -Su 10000 carol@debian:~$ ulimit -Hu 15672
ulimit
の後に -S
ないし -H
と上記のリソースオプションを指定し、その後に値を指定すると、新しいリミット値を設定します。値は数値で指定するか、soft
(現在のソフトリミットの値)、hard
(現在のハードリミットの値)、unlimited
(無制限)のいずれかで指定します。-S
も -H
も指定しなければ、ソフトリミットとハードリミットの両方を設定します。例として、シェルとその子プロセスが生成できるファイルの最大サイズ(-f
)を取り上げます。まず、現在のソフトリミットとハードリミットを確認します。
root@debian:~# ulimit -Sf unlimited root@debian:~# ulimit -Hf unlimited
次に、unlimited
から 500
ブロックへとリミット値を変更します。-S
も -H
も指定しなければ、ソフトリミットとハードリミットの両方を設定します。
root@debian:~# ulimit -f 500 root@debian:~# ulimit -Sf 500 root@debian:~# ulimit -Hf 500
ソフトリミットを 200
ブロックに変更します。
root@debian:~# ulimit -Sf 200 root@debian:~# ulimit -Sf 200 root@debian:~# ulimit -Hf 500
ハードリミットを増やせるのはrootユーザーだけです。ハードリミットを減らしたり、ソフトリミットをハードリミットの値まで増やしたりすることは、一般ユーザーでもできます。新しく設定したリミットを再起動後も有効にするには /etc/security/limits.conf
ファイルに記載します。このファイルは、システム管理者がユーザーを指定してリミットを設定するためにも使えます。(訳注:limists.con
はPAMの設定ファイルであり、LPIC-1の範囲外です。)
Note
|
|
ユーザーのログインを管理する
システム管理者の業務としてユーザーのログイン状況を調べたいことがあります。last
、who
、w
の3つのユーティリティがこの仕事に役立ちます。
last
はログインしたユーザーの一覧をログイン日時の降順で表示します。
root@debian:~# last carol pts/0 192.168.1.4 Sat Jun 6 14:25 still logged in reboot system boot 4.19.0-9-amd64 Sat Jun 6 14:24 still running mimi pts/0 192.168.1.4 Sat Jun 6 12:07 - 14:24 (02:16) reboot system boot 4.19.0-9-amd64 Sat Jun 6 12:07 - 14:24 (02:17) (...) wtmp begins Sun May 31 14:14:58 2020
上の表示例では、直近にログインした2人の状況がわかります。
-
ユーザー
carol
は、ターミナルpts/0
で、ホスト192.168.1.4
から、Sat Jun 6 14:25(6月6日土曜日14時25分)
にセッションを開始し、still logged in(現在もログイン中)
です。その1分前(Sat Jun 6 14:24(6月6日土曜日14時24分)
に、システムがカーネル4.19.0-9-amd64
を使用して起動し、still running(現在も稼働中)
です。 -
ユーザー
mimi
は、ターミナルpts/0
で、ホスト192.168.1.4
から、Sat Jun 6 12:07(6月6日土曜日12時07分)
にセッションを開始し、14:24(14時24分)
にログアウトしました(セッションは02:16(2時間16分)
続きました)。システムは同じ時刻(Sat Jun 6 12:07(6月6日土曜日12時07分)
)にカーネル4.19.0-9-amd64
を使用して起動し、14:24(14時24分)
に終了しました(02:17(2時間17分)
実行されていました)。つまり、ユーザーmini
はシステムを起動してすぐにログインし、2時間余り作業を行い、すぐにシステムをシャットダウンとしたことが分かります。
Note
|
|
last
にユーザー名を渡すとそのユーザーの行だけを表示します。
root@debian:~# last carol carol pts/0 192.168.1.4 Sat Jun 6 14:25 still logged in carol pts/0 192.168.1.4 Sat Jun 6 12:07 - 14:24 (02:16) carol pts/0 192.168.1.4 Fri Jun 5 00:48 - 01:28 (00:39) (...)
ターミナルを表す2列目について少し説明します。pts
は Pseudo Terminal Slave(疑似端末スレーブ) で、tty
は TeleTYpewriter(テレタイプ端末) です。0
は最初のターミナルであることを示します。一般的に tty
はシステム本体のディスプレイとキーボード(コンソール)からのログインを示し、pts
はネットワークからのログインを示します。
Note
|
|
who
と w
は、どちらも現在ログインしているユーザーを調べるコマンドです。who
は現在ログインしているユーザーを表示し、w
はそのユーザーの活動状況も表示します。
オプションを付けずに who
を実行すると、ログインしているユーザー、ターミナル、ログイン日時、ホスト名の4列を表示します。
root@debian:~# who carol pts/0 2020-06-06 17:16 (192.168.1.4) mimi pts/1 2020-06-06 17:28 (192.168.1.4)
よく使うオプションを紹介します。
-b
、--boot
-
システムが起動した日時を表示します。
-r
、--runlevel
-
現在のランレベルを表示します。
-H
、--heading
-
列見出しを表示します。
w
は who
よりも多くの情報を表示します。
root@debian:~# w 17:56:12 up 40 min, 2 users, load average: 0.04, 0.12, 0.09 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT carol pts/0 192.168.1.4 17:16 1.00s 0.15s 0.05s sshd: carol [priv] mimi pts/1 192.168.1.4 17:28 15:08 0.05s 0.05s -bash
1行目に表示されているのは、現在の時刻(17:56:12
)、システムが起動してからの経過時間(up 40 min
)、現在ログイン中のユーザー数(2 users
)、ロードアベレージ(load average: 0.04, 0.12, 0.09
)です。ロードアベレージは、前から順に、1分、5分、15分の値です。
2行目からは8列表示です。
USER
-
ログイン中のユーザー名
TTY
-
そのユーザーが使用しているターミナル
FROM
-
そのユーザーが使用しているホスト(ホスト名ないしIPアドレス)
LOGIN@
-
そのユーザーがログインした時間
IDLE
-
何もしていない(アイドルである)時間
JCPU
-
そのターミナルから実行されたプロセス(バックグラウンドジョブを含む)が使用したCPU時間の合計
PCPU
-
現在のプロセス(
WHAT
列に示されているもの)が使用しているCPU時間 WHAT
-
現在のプロセスのコマンドライン
who
と同様に、w
にユーザー名を渡すとそのユーザーの行だけを表示します。
root@debian:~# w mimi 18:23:15 up 1:07, 2 users, load average: 0.00, 0.02, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT mimi pts/1 192.168.1.4 17:28 9:23 0.06s 0.06s -bash
基本的な sudo
の設定と使用法
このレッスンの冒頭で学んだように、su
を実行して変更後のユーザーのパスワードを入力すると、そのユーザーに切り替えることができます。しかし、rootユーザーのパスワードを他のユーザーと共有することは避けねばなりません。つまり、セキュリティのベストプラクティスとしては、su
ではなく後述する sudo
を用いるべきです。sudo
を学習する前に、ここでは su
でrootユーザーへの切り替えを試しておきます。
su
は su - 変更後のユーザー名
のように実行します。rootユーザーに切り替えるときは変更後のユーザー名を省略できます。(訳注:多くのディストリビューションではrootユーザーが有効化されておらず、rootのパスワードが 決まっていない ことが少なくありません。その場合は sudo passwd root
コマンドで、まずrootユーザーのパスワードをセットすれば、以下のコマンドを実行してみることができます。後で元に戻すことを忘れずに!)
carol@debian:~$ su - root Password: root@debian:~# exit logout carol@debian:~$ su - Password: root@debian:~#
-
(ハイフン)を付けると変更後のユーザー環境をロードします。すなわち、~/.profile
など ログイン時に実行される 初期化スクリプトを実行します。-
を付けなければ変更前のユーザー環境を引き継ぎます。すなわち、変更後のユーザーの初期化スクリプトは実行しません。
carol@debian:~$ su Password: root@debian:/home/carol#
セキュリティの観点からは、su
でrootユーザーに切り替えるのではなく、sudo
コマンドを使用すべきです。このコマンドを使用すると、rootユーザーとして(正確にはrootユーザーに限らず他のユーザーとして)任意のコマンドを実行できます。sudo
には su
と比べて、2つの利点があります。
-
root権限でコマンドを実行するためにrootユーザーのパスワードは必要ありません。
sudoers
というセキュリティポリシーを設定しておけば、自分のパスワードを入力することでroot権限でコマンドを実行できます。デフォルトのセキュリティポリシーは、/etc/sudoers
ファイルと/etc/sudoers.d/
ディレクトリに置かれたファイルです。 -
rootユーザーとして新しいサブシェルを立ち上げる
su
とは異なり、sudo
はシェルを経由せずにコマンドをroot権限で直接実行します。
sudo
は sudo -u 実行ユーザー名 コマンド
のように使います。rootユーザーとしてコマンドを実行する場合は -u 実行ユーザー名
を省略できます。
carol@debian:~$ sudo -u mimi whoami mimi carol@debian:~$ sudo whoami root
Note
|
|
/etc/sudoers
ファイル
sudo
の設定ファイルは /etc/sudoers
(と /etc/sudoers.d
ディレクトリ)です。このファイルでユーザーの sudo
権限を設定します。以下のように、誰が、どのホストから、どのユーザーとして、どのコマンドを実行できるかを設定します。
carol@debian:~$ sudo less /etc/sudoers (...) # User privilege specification root ALL=(ALL:ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL (...)
rootユーザーの権限指定は ALL=(ALL:ALL) ALL
です。rootユーザーは(root
)、すべてのホストから(ALL
)、すべてのユーザー及びグループとして((ALL:ALL)
)、すべてのコマンドを実行できます(ALL
)。%
(パーセント)に続く名前はグループ名とみなされるので、sudo
グループにも同様の権限が指定されています。
ユーザー carol
が、すべてのホストから、すべてのユーザー及びグループとして、apache2
サービスを再起動できるようにするには、sudoers
ファイルに以下の行を追加します。
carol ALL=(ALL:ALL) /usr/bin/systemctl restart apache2
carol
が systemctl restart apache2
を実行する際に、パスワードの入力を求めないようにするなら、以下のように記載します。
carol ALL=(ALL:ALL) NOPASSWD: /usr/bin/systemctl restart apache2
carolがホスト 192.168.1.7
からログインする場合に限って、ユーザー mimi
として /usr/local/bin/weekly_report
コマンドを実行するできるようにするなら、以下のように記載します。
carol 192.168.1.7=(mimi) /usr/local/bin/weekly_report
carol
がシステム管理者になることが決まり、彼女にroot権限を与える場合には、usermod
コマンドの -G
オプションを使って、carol
を sudo
グループのメンバーとするのが簡単です。現在属しているセカンダリグループへの所属をそのままにするなら、-a
オプションも指定して実行します(訳注:usermod
の古いバージョンには -a
オプションがないものがあります)。
root@debian:~# sudo usermod -aG sudo carol
Note
|
Red Hat系のディストリビューションでは |
/etc/sudoers
ファイルを編集する場合には、必ず visudo
コマンドを使用するべきです。visudo
は、規定のテキストエディタで sudoers ファイルを開き、編集を終えてファイルを閉じると、書式をチェックしてから書き込みます。つまり、編集ミスによりsudoersファイルを壊してしまい、sudoコマンドが使えなくなる最悪の事態を避けることができます。デフォルトのテキストエディタを変更するには、/etc/sudoers
の Defaults
に editor
オプションを追加します。例えば、デフォルトのテキストエディタを nano
にするなら、次の行を追加します。
Defaults editor=/usr/bin/nano
Note
|
|
/etc/sudoers
ではエイリアス(別名)が使えます。ユーザー、ターゲット(RunAs)、ホスト、コマンド のそれぞれに対して、複数の項目のリストを1つのエイリアスで参照する機能です。
# Host alias specification Host_Alias SERVERS = 192.168.1.7, server1, server2 # User alias specification User_Alias REGULAR_USERS = john, mary, alex User_Alias PRIVILEGED_USERS = mimi User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS # Cmnd alias specification Cmnd_Alias SERVICES = /usr/bin/systemctl * # User privilege specification root ALL=(ALL:ALL) ALL ADMINS SERVERS=SERVICES # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL
このサンプルの sudoers
ファイルに沿って、それぞれのエイリアスを説明します。
- ホストエイリアス
-
カンマ区切りで、ホスト名、IPアドレス、ネットワーク(ネットマスク)、ネットグループ(
+
を付けます)を並べます。上記のサンプルでは、1つのIPアドレスと2つのホスト名に対して、SERVERS
というホストエイリアスを定義しています。Host_Alias SERVERS = 192.168.1.7, server1, server2
- ユーザーエイリアス
-
カンマ区切りで、ユーザー名、ユーザーID(
#
を付けます)、グループ名(%
を付けます)、グループID(%#
を付けます)、ネットグループ(+
を付けます)を並べます。否定を意味する!
を付けて、除外するユーザーを指定することもできます。上記のサンプルでは、ユーザーcarol
、グループsudo
に属するメンバー、PRIVILEGE_USERS
というユーザーエイリアスで示されるユーザー(mimi
)に対して、ADMINS
というユーザーエイリアスを定義しています。ただし、REGULAR_USERS
というエイリアスで示されるユーザー(john、mary、alex
)は除きます。User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS
- コマンドエイリアス
-
カンマ区切りで、コマンドないしディレクトリを並べます。ディレクトリを指定すると、そのディレクトリ内のすべてのファイルが含まれることになりますが、サブディレクトリは含まれません。上記のサンプルでは、
/usr/bin/systemctl
という1つのコマンド(*
ですべてのサブコマンドを含むことを示す)に対して、SERVICES
というコマンドエイリアスを定義しています。Cmnd_Alias SERVICES = /usr/bin/systemctl *
これらのエイリアスを読み解くと、User privilege specification
セクションの ADMINS SERVERS=SERVICES
という行は、ユーザーエイリアス ADMINS
で示されるすべてのユーザーが、ホストエイリアス SERVERS
で示されるすべてのホストから、コマンドエイリアス SERVICES
で示されるすべてのコマンドを、sudo
を使って実行できると読めます。ターゲット(どのユーザーやグループに切り替えることができるか)は指定されていないので、(ALL:ALL)
と同じです。
Note
|
ターゲット( |
演習
-
特別なパーミッションに関する次の表を埋めてください。
特別なパーミッション 数値表記 記号表記 そのパーミッション だけ が設定されているファイルを検索するコマンド SUID
SGID
-
SUID
だけ が設定されているファイルやSGID
だけ が設定されているファイルを検索して表示しても、あまり実用的ではありません。もっと実用的な以下の検索を実行してください。-
/usr/bin
以下で、他のパーミッションがどうであれ、SUID
が設定されているファイルを検索してください。 -
/usr/bin
以下で、他のパーミッションがどうであれ、SGID
が設定されているファイルを検索してください。 -
/usr/bin
以下でSUID
かSGID
のいずれか一方でも設定されているファイルを検索してください。
-
-
chage
コマンドを使うとユーザーのパスワードの有効期間を変更できます。ユーザーmary
に対して、以下の表の左列に書いてある内容を実現するコマンドを、右列の空欄に書いてください。rootユーザーとして実行することを前提にしてください。内容 chage
コマンドパスワードの有効期間を365日にする。
次回ログイン時にパスワードの変更を強制する。
パスワード変更不可能期間を1日に設定する。
パスワードを失効しないようにする。
ユーザーがいつでもパスワードを変更できるようにする。
パスワード失効前警告期間を7日にして、アカウントが無効になる日を2050年8月20日に設定する。
ユーザーの現在のパスワード有効期間情報を表示する。
-
以下の表の左列に書いてある内容を実行するネットワークユーティリティコマンドを、右列の空欄に書いてください。
内容 コマンド ホスト
192.168.1.55
で、ポート22
を使用しているファイルをlsof
で表示する。Apacheウェブサーバーのデフォルトポートにアクセスしているプロセスを
fuser
で表示する。接続を待ち受けているudpソケットを
netstat
ですべて表示する。ホスト
192.168.1.55
のポート80
から443
をnmap
でスキャンする。 -
一般ユーザーとして、常駐セットサイズ(RSS)に関する以下の作業を
ulimit
コマンドで実行してください。-
RSSの最大値 の ソフト リミットを表示します。
-
RSSの最大値 の ハード リミットを表示します。
-
RSSの最大値 の ソフト リミットを5,000キロバイトに設定します。
-
RSSの最大値 の ハード リミットを10,000キロバイトに設定します。
-
RSSの最大値 の ハード リミットを15,000キロバイトに増やします。できない場合は、その理由を答えてください。
-
-
次の
last
コマンドの出力行を見て、根拠とともに以下の問いに答えてください。carol pts/0 192.168.1.4 Sun May 31 14:16 - 14:22 (00:06)
-
carol
はリモートホストから接続したでしょうか? -
carol
のセッションはどれくらいの時間続きましたか?
-
-
以下に示す
/etc/sudoers
の例を見て、根拠とともに以下の問いに答えてください。# Host alias specification Host_Alias SERVERS = 192.168.1.7, server1, server2 # User alias specification User_Alias REGULAR_USERS = john, mary, alex User_Alias PRIVILEGED_USERS = mimi User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS # Cmnd alias specification Cmnd_Alias WEB_SERVER_RESTART = /usr/bin/systemctl restart apache2 # User privilege specification root ALL=(ALL:ALL) ALL ADMINS SERVERS=WEB_SERVER_RESTART # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL
alex
はどのホストからApacheウェブサーバーを再起動できますか?
発展演習
-
SUID
とSGID
とは別に、スティッキービット という特別なパーミッションがあります。/tmp
ディレクトリなどに設定されており、一般ユーザーは所有者が自分であるファイル以外を削除したり移動したりできなくなります。以下の指示を実行してください。-
パーミッションが755の
~/temporal
に スティッキービット を設定してください。 -
ホームディレクトリ以下から、他のパーミッションがどうであれ、スティッキービット が設定されているファイルを検索してください。
-
~/temporal
の スティッキービット を削除してください。
-
-
passwd -l ユーザー名
またはusermod -L ユーザー名
を実行すると、そのユーザーのパスワードはロックされます。パスワードがロックされていることは/etc/shadow
ファイルのどこを見ればわかりますか? -
chage -E 日付 ユーザー名
ないしchage --expiredate 日付 ユーザー名
に相当する、usermod
コマンドを実行してください。 -
localhostの65535個のポートすべてをスキャンする
nmap
のコマンドを2つ挙げてください。
まとめ
このレッスンでは、様々なセキュリティ管理タスクを説明しました。次のトピックを取り上げました。
-
特別なパーミッションである
SUID
とSGID
が設定されているファイルの検索 -
ユーザーのパスワードの設定/変更、パスワードの有効期間の管理
-
いろいろなネットワークユーティリティを使った、ホスト/ネットワーク上で開いているポートの検出
-
ユーザーが使用できるシステムリソースの制限
-
ユーザーのシステムへのログイン履歴と現在ログインしているユーザーの確認
-
sudo
の使用方法と設定方法(/etc/sudoers
ファイルの書き方)
以下のコマンドを取り上げました。
find
-
ディレクトリ階層の中でファイルを検索します。
passwd
-
ユーザーのパスワードを変更します。
chmod
-
ファイルのモードビット(パーミッション)を変更します。
chage
-
ユーザーのパスワードの有効期間を変更します。
lsof
-
開いているファイルを一覧表示します。
fuser
-
ファイルないしソケットを使用しているプロセスを特定します。
netstat
-
ネットワークの接続状態を表示します。
nmap
-
ネットワークの調査及びポートスキャンを行います。
ulimit
-
ユーザーが使用できるリソースのリミットを確認/設定します。
last
-
ログインしたユーザーを一覧表示します。
lastb
-
ログインに失敗したユーザーを一覧表示します。
/var/log/wtmp
-
ユーザーのログインを記録したデータベースです。
who
-
現在ログインしているユーザーを表示します。
w
-
現在ログインしているユーザーとその活動状況を表示します。
su
-
ユーザーを切り替えます。
sudo
-
別のユーザーとしてコマンドを実行します。rootユーザーとしてコマンドを実行するためによく使います。
/etc/sudoers
-
sudo
のセキュリティポリシーの設定ファイルです。
演習の解答
-
特別なパーミッションに関する次の表を埋めてください。
特別なパーミッション 数値表記 記号表記 そのパーミッション だけ が設定されているファイルを検索するコマンド SUID
4000
s
、S
find -perm 4000
、find -perm u+s
SGID
2000
s
、S
find -perm 2000
、find -perm g+s
-
SUID
だけ が設定されているファイルやSGID
だけ が設定されているファイルを検索して表示しても、あまり実用的ではありません。もっと実用的な以下の検索を実行してください。-
/usr/bin
以下で、他のパーミッションがどうであれ、SUID
が設定されているファイルを検索してください。find /usr/bin -perm -4000
またはfind /usr/bin -perm -u+s
-
/usr/bin
以下で、他のパーミッションがどうであれ、SGID
が設定されているファイルを検索してください。find /usr/bin -perm -2000
またはfind /usr/bin -perm -g+s
-
/usr/bin
以下でSUID
かSGID
のいずれか一方でも設定されているファイルを検索してください。find /usr/bin -perm /6000
-
-
chage
コマンドを使うとユーザーのパスワードの有効期間を変更できます。ユーザーmary
に対して、以下の表の左列に書いてある内容を実現するコマンドを、右列の空欄に書いてください。rootユーザーとして実行することを前提にしてください。内容 chage
コマンドパスワードの有効期間を365日にする。
chage -M 365 mary
、chage --maxdays 365 mary
次回ログイン時にパスワードの変更を強制する。
chage -d 0 mary
、chage --lastday 0 mary
パスワード変更不可能期間を1日に設定する。
chage -m 1 mary
、chage --mindays 1 mary
パスワードを失効しないようにする。
chage -M 99999 mary
、chage --maxdays 99999 mary
ユーザーがいつでもパスワードを変更できるようにする。
chage -m 0 mary
、chage --mindays 0 mary
パスワード失効前警告期間を7日にして、アカウントが無効になる日を2050年8月20日に設定する。
chage -W 7 -E 2050-08-20 mary
、chage --warndays 7 --expiredate 2050-08-20 mary
ユーザーの現在のパスワード有効期間情報を表示する。
chage -l mary
、chage --list mary
-
以下の表の左列に書いてある内容を実行するネットワークユーティリティコマンドを、右列の空欄に書いてください。
内容 コマンド ホスト
192.168.1.55
で、ポート22
を使用しているファイルをlsof
で表示する。lsof -i@192.168.1.55:22
Apacheウェブサーバーのデフォルトポートにアクセスしているプロセスを
fuser
で表示する。fuser -vn tcp 80
、fuser --verbose --namespace tcp 80
接続を待ち受けているudpソケットを
netstat
ですべて表示する。netstat -lu
、netstat --listening --udp
ホスト
192.168.1.55
のポート80
から443
をnmap
でスキャンする。nmap -p 80-443 192.168.1.55
-
一般ユーザーとして、常駐セットサイズ(RSS)に関する以下の作業を
ulimit
コマンドで実行してください。-
RSSの最大値 の ソフト リミットを表示します。
ulimit -m
、ulimit -Sm
-
RSSの最大値 の ハード リミットを表示します。
ulimit -Hm
-
RSSの最大値 の ソフト リミットを5,000キロバイトに設定します。
ulimit -Sm 5000
-
RSSの最大値 の ハード リミットを10,000キロバイトに設定します。
ulimit -Hm 10000
-
RSSの最大値 の ハード リミットを15,000キロバイトに増やします。できない場合は、その理由を答えてください。
一般ユーザーはハードリミットを増やすことはできません。
-
-
次の
last
コマンドの出力行を見て、根拠とともに以下の問いに答えてください。carol pts/0 192.168.1.4 Sun May 31 14:16 - 14:22 (00:06)
-
carol
はリモートホストから接続したでしょうか?リモートホストから接続しました。3列目にリモートホストのIPアドレスが表示されています。
-
carol
のセッションはどれくらいの時間続きましたか?6分間です(最後の列に示されています)。
-
-
以下に示す
/etc/sudoers
の例を見て、根拠とともに以下の問いに答えてください。# Host alias specification Host_Alias SERVERS = 192.168.1.7, server1, server2 # User alias specification User_Alias REGULAR_USERS = john, mary, alex User_Alias PRIVILEGED_USERS = mimi User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS # Cmnd alias specification Cmnd_Alias WEB_SERVER_RESTART = /usr/bin/systemctl restart apache2 # User privilege specification root ALL=(ALL:ALL) ALL ADMINS SERVERS=WEB_SERVER_RESTART # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL
alex
はどのホストからApacheウェブサーバーを再起動できますか?どのホストからも再起動できません。
alex
はユーザーエイリアスREGULAR_USERS
に含まれていて、ADMINS
からは除外されているからです。SERVERS
からsystemctl restart apache2
を実行できるのは、ADMINS
に含まれるユーザーだけです。
発展演習の解答
-
SUID
とSGID
とは別に、スティッキービット という特別なパーミッションがあります。/tmp
ディレクトリなどに設定されており、一般ユーザーは所有者が自分であるファイル以外を削除したり移動したりできなくなります。以下の指示を実行してください。-
パーミッションが755の
~/temporal
に スティッキービット を設定してください。chmod +t temporal
、chmod 1755 temporal
-
ホームディレクトリ以下から、他のパーミッションがどうであれ、スティッキービット が設定されているファイルを検索してください。
find ~ -perm -1000
、find ~ -perm /1000
-
~/temporal
の スティッキービット を削除してください。chmod -t temporal
、chmod 0755 temporal
-
-
passwd -l ユーザー名
またはusermod -L ユーザー名
を実行すると、そのユーザーのパスワードはロックされます。パスワードがロックされていることは/etc/shadow
ファイルのどこを見ればわかりますか?ユーザー名の次の列である2列目が感嘆符で始まる場合、そのユーザーのパスワードはロックされています。(例:
mary:!$6$gOg9xJgv…
)。 -
chage -E 日付 ユーザー名
ないしchage --expiredate 日付 ユーザー名
に相当する、usermod
コマンドを実行してください。usermod -e 日付 ユーザー名
、usermod --expiredate 日付 ユーザー名
-
localhostの65535個のポートすべてをスキャンする
nmap
のコマンドを2つ挙げてください。nmap -p 1-65535 localhost
、nmap -p- localhost