Foreverly

メモ帳

Linuxサーバをセキュアな環境にする

Linuxサーバでセキュアな設定についてまとめてみました。 OSはCentOS6なので古いですが。。 Wordpress周りはまだ調べられてないので どこかでまとめたい。

アドレススキャン対策

ブロードキャスト宛のICMP Echo Requestに対して回答しない

vim /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_broadcasts=1

OSやバージョンの確認

# yum -y install nmap
# nmap -O example.com

telnet example.com 80

まずはこれぐらいはやっておきたいセキュアな設定

  • OSはminimalで必要最小限でインストールする
  • システム管理者用のユーザを作成して利用する
  • yum -y update でパッケージを最新のものを利用する
  • 不要なサービスは停止する
    • audit(コマンドの監査をしない場合)
    • ip6tables(IPv6を使用しない場合)
    • netfs(NFSクライアントを使用しない場合)
    • postfix(SMTPサーバを使用しない場合)
  • rootユーザのログインを禁止する
    • コンソールからのrootログイン禁止
  # echo > /etc/securetty
  • SSHでのrootログイン禁止
  # vim /etc/ssh/ssh_config
  #PermitRootLogin yes

  PermitRootLogin no 
  • SSHを受け付けるPort番号を変更する
  # vim /etc/ssh/ssh_config
  Ports 20022
  • SSHサーバを再起動して設定を反映させる
  • ポートやファイアウォールの設定を確認する
    • netstat -atnp iptables -Ln

OSのセキュリティ

  • GRUBのパスワード設定
    • grub-md5-crypt を実行して出力内容を /boot/grub/grub.conf に書くコム
    • title で始まる行よりも前に password --md5 パスワード の書式で記述する
  • 一般ユーザのログイン管理
    • 不要なユーザのロック usermod -L hoge
    • 不要なユーザのロック解除 usermod -U hoge
    • シェルログインが不要なユーザの作成 useradd -s /sbin/nologon hoge
    • hogeユーザのログインシェルを /sbin/nologin に設定 usermod -s /sbin/nologin hoge
  • コンソールからのrootログイン禁止
    • echo > /etc/securetty
  • su コマンドを使えるユーザを制限
    • /etc/pam.d/su ファイルをrootユーザで開き、 「auth required pam_wheel.so use_uid」という行を追加する
    • これでwheelグループに追加されたユーザのみがsuコマンドを利用できるようになる
    • usermod -G wheel hoge でグループに所属させることが可能
  • sudoコマンドの利用設定
    • visudo を実行し /etc/sudoers を開く
    • hoge ALL=(ALL) ALL ですべてのroot権限が必要なコマンドの実行を許可する
  • Clam AntiVirusのインストール
    • yum install clamav
    • freshclam でウィルスデータベースのアップデート
    • ウィルススキャンはスキャンしたいディレクトリに移動し、clamscanコマンドを実行
    • cd /home して clamscan -r再帰的にディレクトリをスキャンする
    • スキャンしかしないので clamscan --remove で実行時にウィルスの自動削除もしてくれる

メールサーバのセキュリティ

  • ユーザログインの禁止
    • メールサーバを利用するだけのユーザならログインする必要ないのでデフォルトシェルを無効にしておく
    • useradd -s /sbin/nologin newuser

main.cfの主な設定

  • myhostname
    • ホスト名をFQDNで指定
    • myhostname = windsor.example.com
  • mydomain
    • メールサーバのドメイン名を指定
    • mydomain = example.com
  • myorigin
    • メールアドレスの[@]以降が指定されなかった時、デフォルトで保管する値を指定する
    • myorigin = $mydomain
  • inet_interfaces
  • mydestination
    • ローカル配送を行うドメイン名、つまりメールを受け取るドメイン名を指定
    • mydestination = $myhostname, localhost.$mydomain, localhost
  • mynetworks
    • 中継を許可するホストの存在する内部ネットワークアドレスを指定
    • ここに指定したアドレスからのメールは無条件で中継される
    • mynetworks = 192.168.11.0/24, 127.0.0.1/8
  • smtpd_banner
    • SMTPの応答コードに続いて出力されるバナー情報を指定
    • できるだけ情報は少ないほうがいいが、 $myhostname は削除しないようにすること
  • disabled_vrfy_command
    • STMPのVRFYコマンドを禁止にする
    • VRFYコマンドはメールサーバにどのようなアカウントがあるのかを知られる可能性がある
    • disable_vrfy_command = yes
  • smtpd_helo_required
    • SMTP開始時のHELO/EHLOコマンドを必須とするかどうかを指定
    • yesとするとスパムメールの抑制となる
    • smtpd_helo_required = yes
  • smtpd_recipient_restrictions
    • 通常は末尾にrejectを指定する
  • smtpd_sender_restictions
    • メールの送信元アドレスをチェックし、受信を拒否するかどうかを判断

設定の反映

service postfix reload

デフォルト値から変更されている項目のみを表示

postconf -n

FTPサーバのセキュリティ

CentOSではセキュアなvsftpdを使う

vsftpd.confの設定

  • バナーの表示
  • FTP接続確立時のバナーメッセージはftpd_bannerディレクティブで設定
    • ftpd_banner='FTP Login
    • バナーメッセージを格納したファイルを指定するbanner_fileによって無視せれるので注意
  • TCP Wrapperの利用有無
    • tcp_wraller=Yes
    • tcp_wraller=No
  • ユーザリストファイル
  userlist_file=/etc/vsftpd/user_list
  userlist_enable=YES
  userlist_deny=YES
  userlist_file=/etc/vsftpd/user_list
  userlist_enable=YES
  userlist_deny=NO
  • /etc/vsftpd/user_list にはFTP接続にかかわるユーザを登録。
  • userlist_enable=NO となっている場合 /etc/vsftpd/user_list 内に指定されたユーザのみFTP許可されるが、 /etc/vsftpd/ftpusers にユーザ名が指定されている場合はFTPログインを禁止されてしまう
  • ファイルのアップロード
    • FTPサーバをファイル配布用にするならアップロードは不要
    • write_enable=NO でアップロードが禁止になる
  • ユーザの設定
    • Linuxユーザのログインを許可するには local_enable=YES と設定するとLinuxシステムのユーザ名とパスワードを使ってFTPログインが可能になる
  • ホームディレクトリ以外に移動できないように設定
chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
  • 一部のユーザにはホームディレクトリ以外に移動できないように設定
    • chroot_list_enable=YES と設定して、chroot_list にユーザを列挙する
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
  • ホームディレクトリ配下のFTPログイン用のサブディレクトリにログインするようにする
  • 匿名FTPを許可の有無
    • デフォルトでは有効になっている
    • anonymous_enable=YES
    • 匿名FTPを使ってファイル配布したい場合は、匿名アカウントでのファイルアップロードを禁止しておく
    • anon_upload_enable=NO
    • write_enbale=NO なら anon_upload_enable=YES でもファイルのアップロードはできない
  • FTPSを使う
    • 証明書と秘密鍵をまとめてpemファイルを作る
cd /etc/pki/tls/certs
cp mycerts.crt mycerts.pem
cat mycerts.key >> mycerts.pem
  • vsftpd.confに以下の行を追加
ssl_enable=YES #SSLの有効化
rsa_cert_file=/etc/pki/tls/certs/mycerts.pem #サーバ証明書秘密鍵のパス
  • 通常のFTP接続も許可するなら以下の設定もする
  • SSL非対応のFTPクライアントからの利用も想定するときは必要
force_local_logins_ssl=NO #FTPログイン時にSSL接続を強制しないように設定
force_local_date_ssl=NO   #FTP転送時にSSL接続を強制しないように設定
  • vsftpdのログ
    • デフォルトでは/var/log/xferlog にファイル転送に関するログが記録される
xferlog_enable=YES
xferlog_std_format=YES
  • ファイル転送のログに加えて、サーバへの接続に関するログも出力されるようにする
xferlog_std_format=NO
vsftpd_log_file=/var/log/vsftpd.log
  • syslogへ出力するようにもできる
syslog_enable=YES

安全なSSHサーバの設定

/etc/ssh/sshd_config の設定

  • Portの変更
    • Port 20022 #portの待受けを22番以外にする
  • Protocolのバージョンを2にする
    • Protocol 2
  • rootログインを許可しない
    • PermitRootLogin no
  • パスワード認証を許可しない
    • PasswordAuthentication no
  • ログイン認証認証の失敗を許容できる回数を変更
    • MaxAuthTries 3