見様見真似の < 安全確保・セキュリティ >

謝辞: Linux Square > 連載記事 「ゼロから始めるLinuxセキュリティ を参考にさせていただきました。

 ■ 不要なサービスの停止

 Linux 起動時に開始されるサービス

Linux 起動時に、ランレベルに応じたディレクトリ(/etc/rc.d/rc1.d/ 〜 /etc/rc.d/rc6.d/) にある起動用スクリプトのうち、ファイル名が "S" で始まるものが起動されます。
Linux 起動時のデフォルト・ランレベルは、/etc/inittab に記述されています。
"id:3:initdefault" となっていれば、デフォルト・ランレベルは3です。
 xinetd により起動されるサービス

Linux 起動後に、xinetd(スーパーデーモン)により起動されるサービスもあります。 xinetd はポートを監視し、接続要求があると対応するサービスを起動します。
 設定変更 /usr/sbin/setup

#setup (メニューが日本語で表示されるので、先に kon と入力しておく。)
System services から、現在のランレベルでサービスを開始する/しないを設定できます。

起動対象から外したサービス
atd 指定した時間にジョブを実行する at コマンドを使用しないのであれば不要
lpd プリンタサーバーでなければ不要
netfs NFSを使用しないのであれば不要
nfslock NFSを使用しないのであれば不要
portmap NFSやNISなどのRPCを使用したプログラムを使用しないのであれば不要
sendmail メールサーバーでなければ不要
sshd 必要なときだけ起動することにします
起動対象に追加したサービス
httpd システム起動時に Apache を開始することにしました

設定一覧
  FreeWnn * kudzu * sgi_fam
* anacron   lpd   smb
* apmd   named   snmpd
  arpwatch   netfs   sshd
  atd * network * swat
* autofs   nfs * syslog
* canna   nfslock   talk
  chargen   nscd   telnet
  chargen-udp  ntalk   time
* crond * ntpd   time-udp
  daytime * pcmcia   tux
  daytime-udp  portmap * wu-ftpd
* dhcpd   postgresql * xfs
  echo * random * xinetd
  echo-udp * rawdevices   ypbind
  finger   rexec   yppasswdd
* gpm   rhnsd   ypserv
* httpd   rlogin   ypxfrd
  identd   rsh    
* ipchains   rstatd    
  iptables   rsync    
  irda   rusersd    
* isdn   rwalld    
  kdcrotate   rwhod    
* keytable   sendmail    
 設定確認 (Linux 起動時)

/etc/rc.d/rc3.d/
K01kdcrotate K25sshd K73ypbind S08ipchains S56rawdevices
K03rhnsd K30sendmail K74nscd S09isdn S56xinetd
K05atd K34yppasswdd K74ypserv S10network S65dhcpd
K12FreeWnn K35smb K74ypxfrd S12syslog S85gpm
K15postgresql K45arpwatch K75netfs S17keytable S85httpd
K20nfs K45named K86nfslock S20random S90canna
K20rstatd K50snmpd K87portmap S26apmd S90crond
K20rusersd K50tux K92iptables S26ntpd S90xfs
K20rwalld K60lpd K96irda S28autofs S95anacron
K20rwhod K65identd S05kudzu S45pcmcia S99local
 設定確認 (xinetd)

/etc/xinetd.d/
chargen disable=yes  
chargen-udpdisable=yes  
daytime disable=yes  
daytime-udpdisable=yes  
echo disable=yes  
echo-udp disable=yes  
finger disable=yes  
ntalk disable=yes  
rexec disable=yes  
rlogin disable=yes  
rsh disable=yes  
rsync disable=yes  
sgi_fam disable=no  
swat disable=no only_from 127.0.0.1 192.168.1.1
talk disable=yes  
telnet disable=yes  
time disable=yes  
time-udp disable=yes  
wu-ftpd disable=no only_from 192.168.1.0/24


ほかにも停止可能なサービスがあるかもしれませんが、 初心者の悲しさ・・・です。
 TCPラッパー

Red Hat Linux 7.2: オフィシャル Red Hat Linuxカスタマイズガイド 第8章サービスに対するアクセスの制御 TCPラッパーには、 「xinetdは、/etc/hosts.allowと/etc/hosts.denyファイルを使ってシステムサービスへのアクセスを 設定することができます」という記述があります。

/etc/hosts.deny に以下の行を追加します。
ALL : ALL

/etc/hosts.allow に以下の行を追加します。
ALL : 127.0.0.1
ALL : 192.168.1.

これにより、xinetdによって管理されるサービスは、ローカルデバイス (127.0.0.1) と自宅のネットワーク (192.168.1.) からだけ接続が許可されるようになります。
 ■ ポート・スキャンや netstat で安全性をチェック

ポート・スキャン

  1. nmap localhost

    Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
    Interesting ports on tornado.myhome (127.0.0.1):
    (The 1550 ports scanned but not shown below are in state: closed)
    Port       State       Service
    21/tcp     open        ftp                     
    80/tcp     open        http                    
    901/tcp    open        samba-swat              
    5680/tcp   open        canna                   
    
    Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds
    
自分のパソコンに対して、 侵入テスト(ポート・スキャンなど)を実施してくれるサービスがあります。

  1. Gibson Research Shields UP!

  2. Sygate Technologies Sygate Online Services

    代表的なポートだけを調べる Quick Scan のほか、TCP と UDP のポートを1024までスキャンするサービス (それぞれ45分程度)もあります。

    Quick Scan の結果、FTP (21) , ICMP(8) は OPEN、その他は CLOSED と表示されました。

netstat コマンド

  1. netstat -a または netstat -a -n

    すべての TCP 接続と開いているポート(TCP,UDP)が表示されます。

  2. netstat -ap | grep -E -i "LISTEN|udp"

    tcp        0      0 *:swat                  *:*                     LISTEN      823/xinetd          
    tcp        0      0 *:http                  *:*                     LISTEN      4065/httpd          
    tcp        0      0 *:canna                 *:*                     LISTEN      938/cannaserver     
    tcp        0      0 *:ftp                   *:*                     LISTEN      823/xinetd          
    udp        0      0 *:bootps                *:*                                 4831/dhcpd          
    udp        0      0 *:999                   *:*                                 823/xinetd          
    udp        0      0 tornado.myhome:ntp      *:*                                 683/ntpd            
    udp        0      0 *:ntp                   *:*                                 683/ntpd            
    unix  2      [ ACC ]     STREAM     LISTENING     1457   924/gpm             /dev/gpmctl
    unix  2      [ ACC ]     STREAM     LISTENING     1553   1002/xfs            /tmp/.font-unix/fs7100
    unix  2      [ ACC ]     STREAM     LISTENING     1482   938/cannaserver     /tmp/.iroha_unix/IROHA
    
    実行可能プログラムの正確なパスは、/proc/(pid)/exe を見ることで分かります。

    ls -l /proc/683/exe

    lrwxrwxrwx    1 root     root            0 12 28 18:06 /proc/683/exe -> /usr/sbin/ntpd
    
    rpm -qf コマンドで、どのパッケージのファイルであるかを探します。

    rpm -qf /usr/sbin/ntpd

      -> ntp-4.1.1-1

    rpm -V コマンドで、パッケージを検証します。
    パッケージからインストールされたファイルに関する情報と、 元のパッケージに含まれるファイルに関する同一情報が比較されます。
    特に、各ファイルのサイズ、MD5 チェックサム、権限、タイプ、所有者、 およびグループが比較され、すべてが正常に検証された場合は何も出力されません。

    rpm -Vv ntp-4.1.1-1

      -> S.5....T c /etc/ntp.conf

    インストール後に ntp.conf を修正したことが原因と思われます。
 ■ su で root になれるユーザーの制限

  1. /etc/login.defs の最後に次の1行を追加します。

    SU_WHEEL_ONLY yes

  2. /etc/group を修正します。

    wheel:x:10:root -> wheel:x:10:root,user1

    (user1 だけに制限する場合。複数の場合はカンマで区切って並べます。)

  3. /etc/pam.d/su の最後に次の1行を追加します。

    auth required /lib/security/pam_wheel.so use_uid group=wheel

  4. 例:user2 による su コマンド

    $ su
    Password:********
    su: incorrect password
 ■ ssh で root アカウントでのログインを不可にする

telnet は、ネットワークにパスワードなどがテキスト形式のまま流れてしまうため、 セキュリティ面で問題視されることが多いそうです。 このため、遠隔地からターミナル操作をしたい場合には、 ログイン手順から暗号化される ssh(secure shell)を利用するのが良いそうです。 このとき、root アカウントで直接ログインできないように設定を変更します。 これにより、リモートから root になるためには、 ssh と su コマンドの二段階の認証を経る必要があります。

  1. /etc/ssh/sshd_config を修正します。

    PermitRootLogin yes -> no

  2. 例:

    # ssh -l root localhost
    root@localhost's password:********
    Permission denied, please try again.
(追記)SU では動作しないコマンドもあるようです。(ntpq , setup ...)
sshd は必要なときだけ起動することもあり、設定を戻しました。
 ■ 道草・・・ Windows 版 ssh クライアント

Windows 版 ssh クライアントとしては、 Tera Term ProTTSSH を組み込むケースが多いそうです。

  1. Tera Term Pro をインストールしたあと、同じフォルダ(C:\Program Files\TTERMPRO など)に、 解凍した TTSSH のファイルをコピーします。

  2. 環境変数 TERATERM_EXTENSIONS に 1 を設定します。

    Windows 95/98/Me の場合:AUTOEXEC.BAT の最後に SET TERATERM_EXTENSIONS=1 を追加します。
    Windows NT/2000/XP の場合:コントロールパネル -> システム -> 詳細設定タブ -> 環境変数ボタン から追加します。

  3. 接続画面 (1)

    ポート番号が 22 であることを確認して、サーバーに接続します。



  4. 接続画面 (2)

    セキュリティに関する警告が表示されます。 接続先は私のサーバーですので、問題ありません。 Add this machine ... にチェックを入れ、Continue 。



  5. 接続画面 (3)

    サーバー情報を登録するファイル(ssh_known_hosts)が見つかりません、 という意味のようです。なければ作成してくれます。



  6. 接続画面 (4)

    ID , Password を入力して、OK で無事接続されました。



 ■ PAM (Pluggable Authentication Modules)

PAM は、認証を一括管理しているプログラムだそうです。 設定ファイルは /etc/pam.d ディレクトリにあります。 ftp,other,rexec,rlogin,rsh,samba,smtp,sshd,su...

たとえば、rlogin の接続要求があると
  1. /etc/pam.d/rlogin ファイルを探し、存在すればその設定に従う。
  2. /etc/pam.d/rlogin ファイルがなければ、/etc/pam.d/other ファイルを参照する。
  3. other ファイルは、デフォルトでは接続拒否となっているので接続要求は失敗する。
従って、危険なサービス (rsh,rexec,rlogin) は間違ってサービスが起動されても /etc/pam.d に該当する設定ファイルがなければ接続されることはありません。

# mv rsh .rsh
# mv rexec .rexec
# mv rlogin .rlogin

のように、ドットファイルに変更しておけば安全です。

Home