やっと最終章のセキュリティに関するところまで来ました。
スーパーサーバ
スーパーサーバ
LPICをやるまであまり知りませんでしたが、Linuxシステムにはスーパーサーバという機能があります。
Linuxシステムでは各サービスはデーモンとして待機しているプログラムにより提供されています。
デーモンはクライアントからの要求を監視している待機中であっても各種リソースを消費しておりデーモンの数が増えるとシステムリソースを大きく消費しパフォーマンスにも影響がでる恐れがあります。
そのような場合にはスーパーサーバによりリクエストを受け付け、各サービスを必要なときにだけ起動することによってリソースの消費を抑えるなどの効果があります。
他にも以下のようなメリットがあると言われています。
・システムの負荷軽減
・システム管理の負荷軽減
・システムの冗長性/堅牢性の向上
また、デメリットとしては要求発生後にサービスが起動されるため応答が遅くなることなどが挙げられます。
なので、システムによって高頻度で利用されるサービスなどはスーパーサーバで管理することによるデメリットの方が大きくなります。
ここでは、LPICで出題されるinetd及びxinetdについて扱います。
inetd
inetdはLinuxシステムで動作するスーパーサーバの一つです。
詳細な機能については後継のxinetdにて見ていきます。
■デーモン
デーモンはinetdとして機能します。
■設定ファイル
設定ファイルは/etc/inetd.confになります。
書式などはほぼ同様なので、詳細はxinetdにて扱います。
■アクセス制御
アクセス制御はTCPラッパーにて行われています。
TCP wrapperとは、UNIX系OSのシステムに常駐し、外部からのTCP/IP接続のアクセス制御などを行うプログラム。接続元のIPアドレスなどの情報を元に接続の許可や拒否を指定することができる。標準の常駐プログラム(デーモン)名は “tcpd”。
引用元:TCP wrapperとは - IT用語辞典 e-Words
特定サービスのアクセスに対してtcpd経由で接続させるようにして、アクセス制御を行うようなイメージでしょうか。
具体的な設定ファイルについては次項で確認します。
xinetd
xinetdは前述inetdの後継のスーパーサーバになります。
基本的な仕組みなどは同じようですが、アクセス制御などに違いがあります。
■デーモン
デーモンはxinetdとして機能します。
xintedがインストールされていればsystemctlコマンドにより起動、参照できます。
・起動
[root@server1 xinetd.d]# systemctl start xinetd
・状態確認
[root@server1 xinetd.d]# systemctl status xinetd ● xinetd.service - Xinetd A Powerful Replacement For Inetd Loaded: loaded (/usr/lib/systemd/system/xinetd.service; enabled; vendor preset: enabled) Active: active (running) since 土 2021-01-16 01:03:08 JST; 27min ago Process: 1593 ExecStart=/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid $EXTRAOPTIONS (code=exited, status=0/SUCCESS) Main PID: 1594 (xinetd) CGroup: /system.slice/xinetd.service mq1594 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
■設定ファイル
設定ファイルは「/etc/xinetd.conf」になります。
こちらはinetdよりも試験的に出題される傾向があるようなので設定項目を軽く見ておきます。
個人的な印象ですが、項目名がやや特殊で覚えにくい。。
・主要な設定項目
項目 | 内容 |
---|---|
instances | 最大起動プロセス数 |
log_type | ログの記録先を指定(ファイルやsyslogなど) |
includedir | サービスごとの設定ファイルの格納場所 |
また、includedir配下にサービスごとの設定ファイルを格納します。
項目 | 内容 |
---|---|
bind | サービス提供するインタフェースのIPアドレス(またはintarface) |
disable | サービス無効の設定(yes=無効にする) |
no_access | アクセスを拒否する接続元の指定 |
only_from | アクセスを許可する接続元の指定 |
server | サーバプログラムの絶対パス |
server_args | サーバプログラムの起動引数の指定 |
socket_type | サービスの接続タイプを指定 |
user | サーバプログラムの起動ユーザ指定 |
以下に/etc/xinetd.d配下に配置する個別サービスの設定ファイル例を示します。
service testservice { server = /usr/local/bin/testservice sever_args = -debug disable = yes socket_type = stream user = wantan only_from = 192.168.142.0/24 log_type = syslog }
■アクセス制御
xinetdについてもinetdと同様にhosts.allowとhosts.denyのファイルで行います。
・/etc/hosts.allow
アクセス制御を行うファイルの一つが「/etc/hosts.allow」ファイルです。
こちらのファイルでサービスとアクセス元の関連付けを行います。
試験的な重要度は微妙なところですが、設定は以下のように行います。
in.telnetd: 192.168.0. in.ftpd: 192.168.0. host.example.com sshd: 192.168.0. host.example.com
・/etc/hosts.deny
「/etc/hosts.deny」ファイルはアクセス拒否のアクセス制御を行うファイルです。
ファイルの書式はhosts.allowファイルと同様になります。
ALL: ALL
ポート管理系コマンド
少し流れは変わりますが、各種サービスが使用しているポート番号などを確認するコマンドについて確認します。
netstat(ss)コマンド
以前ネットワーク分野で確認したのでそちらを参照。
サービスのポートを確認することができます。
[root@server1 xinetd.d]# netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 36 192.168.142.11:22 192.168.142.1:58720 ESTABLISHED tcp6 0 0 :::3306 :::* LISTEN tcp6 0 0 :::5355 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
lsofコマンド
lsofコマンドはプロセスが使用しているポートを確認できるコマンドです。
ポートを確認する場合には「-i」オプションを使用します。
・使用中の全ポートを表示
[root@server1 xinetd.d]# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dhclient 857 root 6u IPv4 20081 0t0 UDP *:bootpc systemd-r 1067 systemd-resolve 11u IPv6 21290 0t0 UDP *:hostmon systemd-r 1067 systemd-resolve 12u IPv4 21291 0t0 UDP *:hostmon systemd-r 1067 systemd-resolve 14u IPv4 21302 0t0 TCP *:hostmon (LISTEN) systemd-r 1067 systemd-resolve 15u IPv6 21303 0t0 TCP *:hostmon (LISTEN) cupsd 1069 root 10u IPv6 21787 0t0 TCP localhost:ipp (LISTEN) cupsd 1069 root 11u IPv4 21788 0t0 TCP localhost:ipp (LISTEN) sshd 1071 root 3u IPv4 21315 0t0 TCP *:ssh (LISTEN) sshd 1071 root 4u IPv6 21324 0t0 TCP *:ssh (LISTEN) master 1181 root 13u IPv4 21938 0t0 TCP localhost:smtp (LISTEN) master 1181 root 14u IPv6 21939 0t0 TCP localhost:smtp (LISTEN) mysqld 1347 mysql 21u IPv6 22286 0t0 TCP *:mysql (LISTEN) sshd 1381 root 3u IPv4 22401 0t0 TCP server1.test:ssh->192.168.142.1:58720 (ESTABLISHED) sshd 1385 wantan 3u IPv4 22401 0t0 TCP server1.test:ssh->192.168.142.1:58720 (ESTABLISHED)
・特定ポートを使用しているサービスを調べる
特定ポートを使用しているサービスを調べるには「-i:[num]」の形式で指定します。
[root@server1 xinetd.d]# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1071 root 3u IPv4 21315 0t0 TCP *:ssh (LISTEN) sshd 1071 root 4u IPv6 21324 0t0 TCP *:ssh (LISTEN) sshd 1381 root 3u IPv4 22401 0t0 TCP server1.test:ssh->192.168.142.1:58720 (ESTABLISHED) sshd 1385 wantan 3u IPv4 22401 0t0 TCP server1.test:ssh->192.168.142.1:58720 (ESTABLISHED)
nmapコマンド
nmapコマンドは対象サーバの空いているポートを調べるコマンドです。
使い方によってはサイバー攻撃を仕掛ける下準備にもなりますので、管理外のサーバにはむやみに使うなと言われるコマンドでもありますね。
試験的にはそこまで深くは問われないと思われます。
[root@server1 xinetd.d]# nmap localhost Starting Nmap 6.40 ( http://nmap.org ) at 2021-01-16 02:41 JST Nmap scan report for localhost (127.0.0.1) Host is up (0.0000070s latency). Other addresses for localhost (not scanned): 127.0.0.1 Not shown: 996 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 631/tcp open ipp 3306/tcp open mysql Nmap done: 1 IP address (1 host up) scanned in 1.63 seconds
とりあえず実行してみるのであれば、localhostに実行してみるのが無難でしょう。
上記の例ではsshの22番やsmtpの25番ポートが開いていることが分かります。
fuserコマンド
fuserコマンドはリソースを使用中のプロセスを検索及び終了させることができるコマンドです。
インストールされていない場合は「psmisc」パッケージをインストールすることで使用できるようになります。
今まであまり使う機会がありませんでしたが、システム管理などを行う場合はかなり有用そうなコマンドですね。
完全にただの余談です。
・主要オプション一覧
オプション | 内容 |
---|---|
-k | プロセスの強制終了(SIGKILLを送信) |
-m | マウントされたファイルシステムを指定 |
-n | namespaceを指定 |
-u | 検索結果にユーザを追加 |
-v | 詳細情報の表示 |
・リソースを使用しているユーザを特定する
以下はtopコマンドを使用しているユーザを特定する。
[root@server1 wantan]# fuser -u /bin/top /usr/bin/top: 1427e(wantan)
・詳細情報を表示する
上記と同じtopコマンドに対して、PIDなどを表示する。
[root@server1 wantan]# fuser -uv /bin/top USER PID ACCESS COMMAND /usr/bin/top: wantan 1427 ...e. (wantan)top
・ネームスペースで指定する(TCP)
以下はTCPの80番ポートを使用しているプロセスを特定。
[root@server1 wantan]# fuser -n tcp 80 80/tcp: 1570 1571 1572 1573 1574 1575
ユーザと詳細情報を表示する。
[root@server1 wantan]# fuser -n tcp 80 -uv USER PID ACCESS COMMAND 80/tcp: root 1570 F.... (root)httpd apache 1571 F.... (apache)httpd apache 1572 F.... (apache)httpd apache 1573 F.... (apache)httpd apache 1574 F.... (apache)httpd apache 1575 F.... (apache)httpd
・特定したプロセスを停止させる
「-k」オプションを付与することで停止させることができる。
停止後、「-k」オプションなしで実行し、停止を確認する。
[root@server1 wantan]# fuser -n tcp 80 -k 80/tcp: 1570 1571 1572 1573 1574 1575 [root@server1 wantan]# fuser -n tcp 80 [root@server1 wantan]#
・前回(第十四回)
www.wantanblog.com
・次回(第十六回)
www.wantanblog.com