早崎トップ 研究(気候気象) 研究(大気汚染) データリスト Linux Tips Mac Tips

Security

セキュリティ対策用コマンドなどのメモ

Linux のセキュリティ強化に関連する項目のメモ. 一部内容は管理用コマンドの記載事項と重複. 個人向けサーバを前提とした設定なので, 以下のセキュリティ対策は頑健とは言えない.要注意 (参考: 管理用コマンド)

CentOS のセットアップ関連

  初期設定ウィザード

CentOS 初回起動時に実行される初期設定ウィザード「Setup Agent」は, コマンドラインからも実行出来る

  • Authentication
# /usr/sbin/authconfig-tui
  • Firewall Configulation
# /usr/bin/system-config-securitylevel-tui
  • Network Configuration
# /usr/sbin/system-config-network-tui

copied from "http://www.naoyoshi.com/"; written in 15Jan2009 on the web.

 SELinux の有効・無効

getenforce
状態確認
setenforce
setenforce 0 で無効化,setenforce 1 で有効化
  • check SELinux status
$ getenforce
Enforcing
  • Enabling/Disabling SELinux
# setenforce 0
$ getenforce
Permissive
# setenforce 1
$ getenforce 
Enforcing
  • Set startup program for enabling/disabling SELinux
# vi /etc/sysconfig/selinux 
SELINUX=disabled    # <= Disabled
SELINUX=enforcing   # <= Enabled

  サーバとして動作させる場合に停止可能な daemon の例

あくまでも例である(CentOS 5.x の場合; checked 2013-06-30). 使用者によっては必要なサービスもあるはずなので, 以下全部を停止すると悲しい思いをすることがあるかもしれない.

daemon名 サービス内容
avahi-daemon ネットワーク上のホストやサービスを発見する mDNS サービス
auditd SELinux のログサービス
bluetooth Bluetooth デバイスを使用するためのサービス
cpuspeed SpeedStep を利用するためのサービス
cups プリントサービス
firstboot 初回起動時の設定起動用サービス
gpm コンソールマウスを利用するためのサービス
hidd Bluetooth の Human Interface Device (HID) プロトコルサービス
ibmasm IBM Advanced System Management サービス
ip6tables IPv6用 firewall サービス
iptables IPv4用 firewall サービス
isdn ISDN用
mcstrans SELinux を使用している場合に MLS/MCS ラベルを変換するサービス
microcode_ctl Intel CPU のマイクロコード更新サービス
netfs ネットワーク上のファイルシステムの自動マウント/アンマウントサービス
nfslock NFS filesystem のロックを行うサービス
pcscd スマートカード用サービス
portmap NFS や NIS を使用する場合に必須
rawdevices RAW デバイスを使用するためのサービス
restorecond SELinux 使用時にラベルを付与するサービス
rpcgssd NFS クライアントとの通信を行うサービス
rpcidmapd NFS のRPC に使われるIDマッパーサービス
xfs Xフォントサーバ

サービス停止は, CentOS 6.x 以前だと chkconfig (Fedora 17 以後や CentOS 7.x 以後だと systemctl) コマンドを使用. copy & paste 用に,実行例を以下に列挙:

chkconfig cups off
chkconfig hidd off
chkconfig hplip off
chkconfig firstboot off
chkconfig bluetooth off
chkconfig gpm off
chkconfig autofs off
chkconfig isdn off
chkconfig pcscd off
chkconfig sendmail off
chkconfig xfs off
chkconfig yum-updatesd off

(参考: Fedora 17, CentOS 7.x での使用例)

$ sudo systemctl disable httpd.service

(参考: CentOS 7.x で,実際に自分が使うサービスの開始・再開)

(Default では稼働していないサービスの開始.再起動後に)
$ sudo systemctl enable munin-node
$ sudo systemctl enable ntpd
$ sudo systemctl enable httpd

(設定変更後の再起動)
$ sudo systemctl restart httpd
$ sudo systemctl restart sshd
$ sudo systemctl restart firewalld     (iptables 関連)

(稼働サービスのリストアップ)
$ sudo systemctl list-units --type=service

(サスペンドからの復帰時にネットワークを再認識)
$ sudo systemctl restart NetworkManager
$ sudo systemctl restart network

systemctl でよく使う COMMAND: enable, disable, start, stop, reload, restart, reload-or-restart, kill, status

See also トラブル解決メモ(hysk) # ネットワーク関連, 管理用コマンドのメモ(hysk) # systemctl (CentOS 7系列).

開いているポート・提供サービスの確認

  chkconfig ・ systemctl コマンド

ランレベルごとに何のサービスを提供しているか確認

# chkconfig --list

Fedora 17 & CentOS 7 以後だと systemctl status サービス名

# systemctl enable httpd.service
# systemctl status httpd.service

systemctl の実行例は,管理コマンド > デーモンの停止・再起動も参照.

See also (本ページ内) # CentOS セットアップ # サービス停止, トラブル解決メモ(hysk) # ネットワーク関連, 管理用コマンドのメモ(hysk) # systemctl (CentOS 7系列).

  netstat or nmap コマンド

開いているポートのリストアップ

# netstat -an

開いているポートのリストアップ

# nmap localhost

netstat や nmap は,サーバ管理者やネットワーク管理者の許可なく 使用すべきでない. これらはポートスキャンユーティリティである. 例え悪意のない利用であっても, 下手に使うと「攻撃者」あつかいされる可能性がある.

ネットワーク経路

 traceroute (tracert) コマンド

対象サーバへの経路.Linux では,tracert の実体は traceroute である.

# tracert  -d www.google.co.jp
traceroute to www.google.co.jp (173.194.126.248), 30 hops max, 40 byte packets
 1  192.168.xxx.xxx (192.168.xxx.xxx)  0.334 ms  0.434 ms  0.533 ms
 2  192.168.1.1 (192.168.1.1)  2.048 ms  2.049 ms  2.048 ms
 3  xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)  2.212 ms  2.199 ms  2.198 ms
 4  xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)  2.352 ms  2.355 ms  2.355 ms
 5  * * *
 6  xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)  3.049 ms  1.334 ms  1.326 ms
 7  hogehoge.jp (xxx.xxx.xxx.xxx)  7.498 ms  7.256 ms  7.794 ms
 8  hagehage.jp (xxx.xxx.xxx.xxx)  7.788 ms  7.390 ms  7.384 ms
 9  * * *
10  209.85.241.90 (209.85.241.90)  9.276 ms  9.278 ms  9.448 ms
11  72.14.232.109 (72.14.232.109)  11.583 ms  11.763 ms  10.953 ms
12  nrt04s08-in-f24.1e100.net (173.194.126.248)  8.386 ms  8.385 ms  8.413 ms

ssh 関連

root にて設定ファイル (/etc/ssh/sshd_config)を修正.修正後は restart

/sbin/service sshd restart

サービスの restart よりも sshd を reload した方が応答早い

/etc/init.d/sshd reload

 新規ユーザ追加時の作業手順

新規ユーザ追加時の手順をメモ. (この手順は,早崎個人が実施したもの. サーバのセキュリティ対策内容に応じて異なる事に注意)

  1. 管理者が実施
    1. /etc/ssh/sshd_config の AllowUsers に追記,sshd を reload する
    2. /etc/security/access.conf の末尾の設定(後述)に追記
    3. (これまで接続許可してなかったIPドメインからのアクセスの場合)/etc/hosts.allow の sshd 部分に 該当するドメイン(必要ならユーザ名も)を追記
  2. 一般ユーザが実施
    1. (ユーザに実施してもらうこと) ログインに使用する計算機でRSA鍵を作成.
    2. 作成した鍵のうち,公開鍵 (id_rsa.pub) をUSB メモリなどにコピーして サーバ側に持ってくる.ホストに直結してコピー.
    3. コピーした id_rsa.pub を ~/.ssh/authorized_keys に追加(存在しなければ新規作成.chmod 600 を忘れるな)

  アクセス制限,認証関連

/etc/ssh/sshd_config に以下を追加. あくまでも例なので,サーバの使用状況(ユーザ環境,ネットワーク運用方針など)に応じて 必要事項のみ採用すればよかろう:

#Port 22
Port 10022      # default の sshd 待ち受けポート番号を 22 から 10022 に変更

#Protocol 2,1
Protocol 2      # SSH2 のみに限定.今時はこれが default だろうが,念のため.

PasswordAuthentication no   # パスワードを使用せず,公開鍵認証のみでログイン

# Change to no to disable s/key passwords
ChallengeResponseAuthentication no

ListenAddress  192.168.1.100  # ssh アクセスできる端末を固定(極めて重要なサーバの場合.ネット接続の利便性は失われる)
PermitRootLogin no   # root 権限でのリモートログインを禁止

AllowUsers  hogehoge    # ユーザ hogehoge のみSSH接続を許可

PAM認証を使っている場合(UsePAM yes)は, /etc/pam.d/sshd やら /etc/security/access.conf などの修正をすることで, 細かい条件での接続制限も可能. しかし,公開鍵認証だけでのログインにしているなら, ここまで修正しなくてもよいか.

PAM認証関連も設定したので,手順を記録.

/etc/pam.d/sshd 先頭行に以下を追加

# vi /etc/pam.d/sshd
#%PAM-1.0
account    required     pam_access.so
(以下,略)

/etc/security/access.conf 最終行に以下を追加. ユーザ hogehoge, wheel グループ, サーバ監視 daemon が使うユーザ munin による アクセスを可能にしてある. なお,最後2行を書いても,munin が拒否された.書式を間違えたか,それとも...?

# vi /etc/security/access.conf
 (表示略)
# SSH access only permit the specified user(s) in the "wheel" group!
- : ALL EXCEPT munin hogehoge wheel: ALL
#+ : munin : 127.0.0.0/24
#+ : munin : ::ffff:127.0.0.0/127

以下はセキュリティを高める事とずれた話題. 外部に開かれたサーバではお薦めできない設定なので要注意. ある一定のアイドル時間が経過すると,SSHコネクションが切断されることもある. こうなると,ウィンドウを強制終了させる羽目になる. これが嫌だったら,サーバの sshd_config で以下のように修正する.

ClientAliveInterval 60    # 無操作時間が一定以上継続したときにSSH接続が切断されるのを防止するため

  ssh 経由ログイン時の su コマンド不許可

『wheel グループに所属するユーザだけが su コマンドを使って root になれる』設定

/etc/login.defs (ファイル末尾でよい) に以下を追加

SU_WHEEL_ONLY  yes

/etc/pam.d/su で,pam_wheel.so use_uid を使うようコメントアウトを外す

# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid

  Xフォワードの許可・不許可

これはセキュリティ強化とは正反対の設定. しかし,研究する上でのリモートサイト接続の利便性を考えると, X のフォワーディングを許可した方が良い場合もある. 各自のネットワーク環境によって可否を判断すべし (もちろん,職場・学校のネットワーク運用方針を遵守するのが大前提). 判断をするための知識が無いのなら,やってはいけない.

X11Forwarding yes

下記に示す xauth 関連の警告メッセージを抑制したい場合, アクセスする側(ローカル側)の計算機設定(/etc/ssh/ssh_config)で, ForwardX11Trusted の記述を確認. これを yes にすれば,xauth 関連のツッコミメッセージが出なくなる.

Warning: untrusted X11 forwarding setup failed: xauth key data not generated
Warning: No xauth data; using fake authentication data for X11 forwarding.

  パスワード・パスフレーズ入力なしでアクセス

これは危険な設定であるが, 使用環境によっては実施せざるを得ない or 実施した方が作業効率が飛躍的に高まる,などの場合がある. どういう条件なら設定可能かという判断基準は, 使用環境(学校・職場)のネットワーク運用方針が多種多様なので, ここでは書かない (万人に当てはまる「正解」がない,という意味).

用語の定義

サーバA
ssh アクセス元. 具体的には,「自分のデスク上にある,『日常的に直接ログインする端末』」 を想定
サーバB
ssh アクセス先. 具体的には, 「リモートログインで使用する計算機. サーバAからのリモート利用が 非常に多く, terminal を開くたびにパスワード・パスフレーズ入力するのが 面倒」 という計算機を想定.これを,何とか改善したい

手順

  1. サーバA, サーバB の双方で ssh-keygen -t rsa を実行.公開鍵作成,パスフレーズを設定.
  2. サーバA の id_rsa.pub を,サーバBの ~/.ssh/ 以下に authorized_keys2 として保存(既存のauthorized_keys2 が存在する場合は追記)
  3. サーバB でアクセス権変更. chmod 600 ~/.ssh/authorized_keys2
  4. サーバA で,ログイン時に ssh-agent を実行,ログアウト時に ssh-agent を停止するように設定
$ vi ~/.bash_profile
※以下を追記
eval `ssh-agent`
ssh-add
$ vi ~/.bash_logout
※以下を追記
eval `ssh-agent -k`

以上の設定により,サーバAでログイン時,GNOME 起動前にパスフレーズ入力を求められる. 入力後は,サーバA からサーバB に対して ssh ログイン ( slogin サーバB )しても, パスフレーズ入力をせずにログインできる.

denyhosts の設定

SSH 辞書攻撃,または Brute Force Attack から防御するための手段として使用. 主な機能は,不正アクセスを試みてくる IP address を検知し, それを /etc/hosts.deny に自動登録する,というもの.

  インストール方法

CentOS なら,yum 一発 (EPEL レポジトリが追加されていること)

yum -y install denyhosts

  設定ファイル (/etc/denyhosts.conf) 編集

主な設定項目を以下に列挙:

PURGE_THRESHOLD = 2
DENY_THRESHOLD_INVALID = 2
DENY_THRESHOLD_VALID = 3
PURGE_DENY = 4w
ADMIN_EMAIL = admin@localhost
RESET_ON_SUCCESS = yes

それぞれのパラメータの意味は以下の通り:

PURGE_THRESHOLD = 2
(4週間後にpurgeされたとしても)過去に2回登録されたIPは,二度とアクセス許可しない. ただし,denyhosts の WORKDIR/ 以下のホスト情報自体を編集すれば, アクセス許可することも可能(のはず)
DENY_THRESHOLD_INVALID = 2
無効なIDで2回ログインを試してきたらブラックリスト(/etc/hosts.deny)に登録
DENY_THRESHOLD_VALID = 3
有効なIDであっても,3回ログインを試してきたらブラックリスト(/etc/hosts.deny)に登録
RESET_ON_SUCCESS=yes
ログインに成功したら,該当IPアドレスでの失敗カウントをリセットする. こうしないと,自分自身のタイプミスによるログイン失敗が累積されて, 自分自身がログインできないという事態が生じる (実際に,何度か経験するはめになった)

  アクセス拒否の解除方法

不正アクセスでないにもかかわらず,間違って登録されてしまう事もありうる.その場合は,以下の手順でアクセス拒否を解除する:

  1. /etc/init.d/denyhosts stop
  2. /etc/hosts.deny から該当IPアドレスを削除
  3. WORKDIR/hosts から(以下同文)
  4. WORKDIR/hosts-restricted から(以下同文)
  5. WORKDIR/hosts-root から(以下同文)
  6. WORKDIR/hosts-valid から(以下同文)
  7. WORKDIR/user-hosts から(以下同文)
  8. (optional) WORKDIR/allowed-hosts に登録されたくないIPを追記
  9. /etc/init.d/denyhosts restart

なお,WORKDIR は /var/lib/denyhosts/ である(CentOS の yum でのインストールの場合).

sudo

  基本方針

  • 管理者グループを作り,対象ユーザを登録
  • 管理者グループは,root 権限の全てを実行可能
  • sudo での実行時には,各ユーザのパスワード入力を求める

  visudo による設定ファイル更新

  • ユーザ名 hoge を管理者グループ sysadmin に登録
# groupadd sysadmin
# usermod -G sysadmin hoge
  • visudo による設定変更

パスワード認証つきの場合

%sysadmin  ALL=(ALL) ALL

パスワード認証なしの場合(危険なので,出来るだけ行わないこと)

%sysadmin ALL=(ALL)  NOPASSWD: ALL

指定されたコマンド(例: mount & umount)だけを実行可能,引数は任意.

%sysadmin  ALL=/bin/mount, /bin/umount

 さらに用途を限定

上記の例では,mount, umount コマンドに引数の制約がないので, 誤ってシステム領域や cron 実行に必要となるファイルシステムを umount する可能性がある.

どんなに注意深いユーザでも,いつか必ずミスをする. 人為的なミスがシステム領域や日々の運用に致命的な影響をあたえない ようにするためには,どうすれば良いか? そもそも,重要なファイルシステムを umount 出来なくすれば良い.

例: USB接続HDD (ここでは /mnt/usb01) のマウント・アンマウントのみ実行許可

%sysadmin  ALL=/bin/mount /mnt/usb01, /bin/umount /mnt/usb01

autofs とHDDのUUID情報を組み合わせて,/mnt/usb01 にマウント可能なHDDを限定する事も出来る. ただし,制限を加えるためには,接続する可能性のあるHDDのUUID情報を集める必要がある. 数が増えると,とてもじゃないが維持・管理できない. 個人ないしごく少数で利用する計算機でのみ有効な方法だろう.

 参考文献

  • 日経Linux 2010年6月号

proftpd の手動コンパイル

proftpd のセットアップ (tar ball 使用)へ完全移設 (2016-02-27).
移設(2012-08-21)してから,3.5年が経過していた. ここに残っていたことすら忘れていた.

更新履歴

Date Changes
2016-02-27 ページ内の参照用IDを付け替え. 番号付けのルールは, Linux tips (hysk) # 自分専用ルール・HTML に従う.
2012-08-21 proftpd 関連を別ファイルに移設.
2009-09-xx 多分,このくらいの時期に記載開始. FreeStyle Wiki を使って書き始めたと記憶.