サーバーの作業をする間だけ、root 以外がログインできないようにしたい
【疑問】メンテナンス中だけ一般ユーザーを入れたくない。/etc/nologin・シャドウパスワード・不要なサービス・xinetd・TCP ラッパー【LPICレベル1】
前提のおさらい。待ち受けてるポートとプロセスは ss -tulnp や lsof -i で調べられる。開いてるポートが少ないほど、攻められる入口も少ない
>>1
/etc/nologin を作る。あると root 以外のログインが拒否されて、ファイルの中身が表示される(pam_nologin の man)echo "メンテナンス中です" > /etc/nologin、終わったら rm
Debian の /etc/pam.d/login にも auth requisite pam_nologin.so の行があった
>>3
起動の途中で入れないのも同じしくみで、systemd が /run/nologin を作ってる(tmpfiles.d の設定に「System is booting up. Unprivileged users are not permitted to log in yet.」の文があった)
>>3
特定のユーザーだけ止めるなら?
>>5
そのユーザーのシェルを /usr/sbin/nologin や /bin/false にする(usermod -s)か、アカウントの期限を切る(chage -E 0)。/etc/nologin は全員まとめて
>>2
ホストのセキュリティで、ほかに基本になることは?
>>7
1. シャドウパスワード:パスワードのハッシュを誰でも読める /etc/passwd やなく、root しか読めない /etc/shadow に置く。古い形式からは pwconv で移す(戻すのは pwunconv)
2. 要らんサービスを止める
3. SUID のファイルを把握する
4. 接続できる相手を絞る
>>8
要らんサービスの止め方は?
>>9systemctl list-units --type=service --state=running で動いてるサービス、ss -tulnp で待ち受けを確かめて、要らんものは systemctl disable --now 名前。完全に起動させないなら mask
>>8
SUID のファイルはどうやって探すん
>>11find / -perm -4000 -type f(SGID は -2000)。試したマシンでも passwd、su、sudo、mount、umount、newgrp、chsh などが出た。知らんものが増えてたら疑う
xinetd ってのが試験範囲にあった
>>13
スーパーサーバー。いろんなサービスのポートを代わりに待ち受けて、接続が来たときだけそのサービスを起動する(昔は inetd)
設定は /etc/xinetd.conf と /etc/xinetd.d/ の下のサービスごとのファイル。Debian の xinetd パッケージの time の例はservice time{disable = yessocket_type = streamprotocol = tcpuser = rootwait = no}
>>14
disable = yes で止めてある。ほかに server(動かすプログラム)、only_from・no_access(つないでよい相手・だめな相手)を書く。変えたら xinetd を再起動
>>14
今どきは xinetd を使わんのでは
>>16
systemd では .socket ユニットが同じ役目。ListenStream= などでポートやソケットを待ち受けて、来たら同じ名前の .service を起動する。試したマシンにも dbus.socket、syslog.socket などがあった。止めるなら .socket のほうも disable する
>>8
接続できる相手を絞る TCP ラッパーって?
>>18
libwrap を使うサービス(tcpd 経由のものなど)が、/etc/hosts.allow と /etc/hosts.deny を見て許すか決める(hosts_access の man)
1. hosts.allow に当てはまれば許可
2. そうでなく hosts.deny に当てはまれば拒否
3. どちらにもなければ許可
最初に当てはまった行で決まる
>>19
書き方は「デーモン : クライアント」。基本は全部拒否にして、許すものだけ書く
hosts.deny:ALL: ALL
hosts.allow:sshd: 192.0.2.0/255.255.255.0 や sshd: 192.0.2.(前方一致)、ALL: LOCAL。EXCEPT で除外もできる
>>20
ALL: ALL を hosts.deny に書いて、allow を空のままにしたら、全部止まるってことやな
>>19
最近の OpenSSH は libwrap に対応してないし、Red Hat 系も TCP ラッパーをやめてる。今は nftables や firewalld のファイアウォールで絞るのが普通。試験では仕組みと順番が問われる
>>3
全員止めるなら /etc/nologin、シャドウパスワード、要らんサービスは disable、SUID は find -perm -4000、xinetd と .socket、TCP ラッパーは allow が先で、どっちにもなければ許可。メンテのときは nologin を置くわ
管理人のひとこと
- /etc/nologin があると root 以外のログインを拒否し、中身を表示する(pam_nologin)。起動中は /run/nologin。個別には nologin シェルや chage -E 0。
- シャドウパスワード(/etc/shadow、pwconv・pwunconv)。不要なサービスは
systemctl list-units --type=service --state=runningと ss -tulnp で確認し、systemctl disable --now(mask)。SUID はfind / -perm -4000 -type f。 - xinetd(昔は inetd)はポートを代わりに待ち受けて接続時にサービスを起動する。/etc/xinetd.conf と /etc/xinetd.d/(disable・socket_type・protocol・user・wait・server・only_from)。systemd では .socket ユニット。
- TCP ラッパー:hosts.allow に一致すれば許可、次に hosts.deny に一致すれば拒否、どちらもなければ許可。書式は「デーモン : クライアント」(ALL・LOCAL・EXCEPT、ネットワーク/マスク)。今はファイアウォールが主流。