SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【LPIC102】スーパーサーバとアクセス管理 LPICで学ぶLinux15


やっと最終章のセキュリティに関するところまで来ました。

スーパーサーバ

スーパーサーバ

LPICをやるまであまり知りませんでしたが、Linuxシステムにはスーパーサーバという機能があります。

Linuxシステムでは各サービスはデーモンとして待機しているプログラムにより提供されています。
デーモンはクライアントからの要求を監視している待機中であっても各種リソースを消費しておりデーモンの数が増えるとシステムリソースを大きく消費しパフォーマンスにも影響がでる恐れがあります。

そのような場合にはスーパーサーバによりリクエストを受け付け、各サービスを必要なときにだけ起動することによってリソースの消費を抑えるなどの効果があります。

f:id:wantanBlog:20210115232403p:plain

他にも以下のようなメリットがあると言われています。

・システムの負荷軽減
・システム管理の負荷軽減
・システムの冗長性/堅牢性の向上

また、デメリットとしては要求発生後にサービスが起動されるため応答が遅くなることなどが挙げられます。
なので、システムによって高頻度で利用されるサービスなどはスーパーサーバで管理することによるデメリットの方が大きくなります。

スーパーサーバ - Wikipedia


ここでは、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.allowhosts.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