読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】メンテナンス中だけ一般ユーザーを入れたくない。/etc/nologin・シャドウパスワード・不要なサービス・xinetd・TCP ラッパー【LPICレベル1】

23レスカテゴリ:Linux
1: 名無しさん

サーバーの作業をする間だけ、root 以外がログインできないようにしたい

2: 名無しさん

前提のおさらい。待ち受けてるポートとプロセスは ss -tulnp や lsof -i で調べられる。開いてるポートが少ないほど、攻められる入口も少ない

3: 名無しさん

>>1
/etc/nologin を作る。あると root 以外のログインが拒否されて、ファイルの中身が表示される(pam_nologin の man)
echo "メンテナンス中です" > /etc/nologin、終わったら rm
Debian の /etc/pam.d/login にも auth requisite pam_nologin.so の行があった

4: 名無しさん

>>3
起動の途中で入れないのも同じしくみで、systemd が /run/nologin を作ってる(tmpfiles.d の設定に「System is booting up. Unprivileged users are not permitted to log in yet.」の文があった)

5: 名無しさん

>>3
特定のユーザーだけ止めるなら?

6: 名無しさん

>>5
そのユーザーのシェルを /usr/sbin/nologin や /bin/false にする(usermod -s)か、アカウントの期限を切る(chage -E 0)。/etc/nologin は全員まとめて

7: 名無しさん

>>2
ホストのセキュリティで、ほかに基本になることは?

8: 名無しさん

>>7
1. シャドウパスワード:パスワードのハッシュを誰でも読める /etc/passwd やなく、root しか読めない /etc/shadow に置く。古い形式からは pwconv で移す(戻すのは pwunconv)
2. 要らんサービスを止める
3. SUID のファイルを把握する
4. 接続できる相手を絞る

9: 名無しさん

>>8
要らんサービスの止め方は?

10: 名無しさん

>>9
systemctl list-units --type=service --state=running で動いてるサービス、ss -tulnp で待ち受けを確かめて、要らんものは systemctl disable --now 名前。完全に起動させないなら mask

11: 名無しさん

>>8
SUID のファイルはどうやって探すん

12: 名無しさん

>>11
find / -perm -4000 -type f(SGID は -2000)。試したマシンでも passwd、su、sudo、mount、umount、newgrp、chsh などが出た。知らんものが増えてたら疑う

13: 名無しさん

xinetd ってのが試験範囲にあった

14: 名無しさん

>>13
スーパーサーバー。いろんなサービスのポートを代わりに待ち受けて、接続が来たときだけそのサービスを起動する(昔は inetd)
設定は /etc/xinetd.conf と /etc/xinetd.d/ の下のサービスごとのファイル。Debian の xinetd パッケージの time の例は
service time
{
disable = yes
socket_type = stream
protocol = tcp
user = root
wait = no
}

15: 名無しさん

>>14
disable = yes で止めてある。ほかに server(動かすプログラム)、only_from・no_access(つないでよい相手・だめな相手)を書く。変えたら xinetd を再起動

16: 名無しさん

>>14
今どきは xinetd を使わんのでは

17: 名無しさん

>>16
systemd では .socket ユニットが同じ役目。ListenStream= などでポートやソケットを待ち受けて、来たら同じ名前の .service を起動する。試したマシンにも dbus.socket、syslog.socket などがあった。止めるなら .socket のほうも disable する

18: 名無しさん

>>8
接続できる相手を絞る TCP ラッパーって?

19: 名無しさん

>>18
libwrap を使うサービス(tcpd 経由のものなど)が、/etc/hosts.allow と /etc/hosts.deny を見て許すか決める(hosts_access の man)
1. hosts.allow に当てはまれば許可
2. そうでなく hosts.deny に当てはまれば拒否
3. どちらにもなければ許可
最初に当てはまった行で決まる

20: 名無しさん

>>19
書き方は「デーモン : クライアント」。基本は全部拒否にして、許すものだけ書く
hosts.deny:ALL: ALL
hosts.allow:sshd: 192.0.2.0/255.255.255.0 や sshd: 192.0.2.(前方一致)、ALL: LOCAL。EXCEPT で除外もできる

21: 名無しさん

>>20
ALL: ALL を hosts.deny に書いて、allow を空のままにしたら、全部止まるってことやな

22: 名無しさん

>>19
最近の OpenSSH は libwrap に対応してないし、Red Hat 系も TCP ラッパーをやめてる。今は nftables や firewalld のファイアウォールで絞るのが普通。試験では仕組みと順番が問われる

23: 名無しさん

>>3
全員止めるなら /etc/nologin、シャドウパスワード、要らんサービスは disable、SUID は find -perm -4000、xinetd と .socket、TCP ラッパーは allow が先で、どっちにもなければ許可。メンテのときは nologin を置くわ

管理人のひとこと