SSH
クライアント設定
/etc/ssh/ssh_configファイルはSSHクライアントの各種設定を行える。
StrictHostKeyChecking
SSHで接続時に接続先ホストの情報をチェックし、初接続であれば接続確認を行う。
この確認を行うかどうかの設定を変更できる。
ただし、接続済みホストの情報は記録されるので、同じホスト名でサーバが変わった場合はエラーとなる。
これはUserKnownHostsFile設定を変更する必要がある。
- チェックしない
StrictHostKeyChecking no
UserKnownHostsFile
各ユーザ用の接続ホスト情報のデータベースファイルのパスを指定する。
デフォルトでは ~/.ssh/known_hosts である。
/dev/nullに指定することで、情報が保存されなくなるがホストのチェックもできなくなるので、
StrictHostKeyChecking設定を変更するか、グローバルのホストデータベースファイルにホストを登録する必要がある。
- データベースファイルを利用しない
UserKnownHostsFile /dev/null
この設定を行うと、ファイルが存在しないので、接続時に毎回新規にデータベースへ登録をしようとする。
そのため、warningメッセージが表示されてしまうので、ログレベルを変更することで、これを表示させないように出来る。
LogLevel
SSH使用時に表示されるメッセージのレベルを設定できる。
QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG(DEBUG1)、DEBUG2、DEBUG3が設定可能で、デフォルトはINFO。
サーバ設定
/etc/ssh/sshd_configファイルはSSHデーモンの各種設定を行える。
Port
待ち受けるポート番号を指定する。
インターネットからアクセスできるサーバの場合、ポート番号を排ポートに変えておいた方が無難である。
設定変更する場合、ファイアウォールの設定も忘れずに変えること。
- 書式
Port <ポート番号>
- デフォルト
Port 22
- 参考
- ログイン失敗のログを確認する
サーバが起動してからのログイン失敗のログが表示される
最新のものが最初に表示されるので、表示件数が多い場合はheadで絞る
- 100件表示
lastb -i | head -100
- 全件表示
lastb -i
- 100件表示
- firewalldの設定変更方法
ポート番号を10022とする
firewall-cmd --permanent --new-service=ssh_10022 firewall-cmd --permanent --service=ssh_10022 --add-port=10022/tcp firewall-cmd --permanent --zone=public --add-service=ssh_10022 firewall-cmd --permanent --zone=public --remove-service=ssh firewall-cmd --reload
※reload時点では既存のSSHコネクションは切断されない
- ログイン失敗のログを確認する
PermitRootLogin
RootがSSHログイン可能かどうかを設定する。
通常rootユーザはSSHで直接ログイン不可にしたほうが良いので、ログインできないよう設定したほうがよい。
- ログイン不可
PermitRootLogin no
- 通常通りログイン可能
PermitRootLogin yes
- パスワード無しでログイン可能
PermitRootLogin without-password
- キーペアを使用したログインは可能だが、ログイン後、登録したコマンドが実行され、接続が切断される
PermitRootLogin forced-commands-only
forced-commands-onlyで実行されるコマンドを登録するには以下を実施する。
vi /root/.ssh/authorized_keys # ssh-rsa XXXXXX の前に以下のように記述する # command="実行内容" ssh-rsa XXXXX
例えば、メッセージを表示する場合は以下のように書けばよい
command="echo 'Don't login by root user.';echo;sleep 5" ssh-rsa XXXXX
MaxSessions
SSHでは1つの接続上に複数のセッションを作成することができる。
このパラメータではその上限数を設定する。
- 書式
MaxSessions <セッション数>
- デフォルト
MaxSessions 10
MaxStartups
新たにSSH接続を受ける際の接続上限数を指定する。
- 書式
MaxStartups <接続可能数>:<接続拒否率>:<最大接続可能数>
- 接続可能数
接続を拒否することなく接続可能な接続数を設定する - 接続拒否率
接続可能数を超えた状態で新たに接続を受けた際に、その接続を拒否する確率を設定する - 最大接続可能数
最大接続可能数を設定する。この数に接続数が達すると、以降の新たな接続は必ず拒否する。
- 接続可能数
- デフォルト
MaxStartups 10:30:60
PasswordAuthentication
パスワードによる認証を許可するかどうかを指定する。
許可しない場合、キーペアによる認証が必須となる。
- 書式
PasswordAuthentication [ yes | no ]
- デフォルト
PasswordAuthentication yes
UseDNS
接続元のIPアドレスを逆引きし、再度正引きすることで得たIPアドレスが接続元のIPアドレスと一致するかを検査するかどうか。
- 書式
UseDNS [ yes | no ]
- デフォルト
UseDNS yes
Tips
ログイン用鍵ペアを作成する
ssh-keygen # Enter file in which to save the key (/root/.ssh/id_rsa): に出力パスを入力してエンター # Enter passphrase (empty for no passphrase): に何も入力せずにエンター # Enter same passphrase again: に何も入力せずにエンター mv <出力パス>/id_rsa.pub <出力パス>/authorized_keys chmod 400 <出力パス>/id_rsa chmod 400 <出力パス>/authorized_keys
SFTP専用ユーザを作成する
ホームディレクトリは作成されるので、そこにファイルが作成される。suコマンドも含めてターミナルログインはできない。
useradd -s /usr/libexec/openssh/sftp-server <ユーザ名>
鍵認証を行う場合は鍵を発行する
cd /home/<ユーザ名>
ssh-keygen
# Enter file in which to save the key (/root/.ssh/id_rsa): に"/home/<ユーザ名>/.ssh/id_rsa"を入力してエンター
# Enter passphrase (empty for no passphrase): に何も入力せずにエンター
# Enter same passphrase again: に何も入力せずにエンター
mv .ssh/id_rsa.pub .ssh/authorized_keys
chmod 400 .ssh/id_rsa .ssh/authorized_keys
POSIX ACL
PAM
Red Hat系で採用されているユーザ認証モジュール。
単独で動作し、SSHなど各サービスに対して認証サービスを提供するので、
個々のサービスで具体的な認証作業を行う必要がない。
設定ファイル
設定ファイルは以下のディレクトリの以下に保存されている。
/etc/pam.d/
文法
設定ファイルは以下の書式で記述される。
認証モジュール 制御方式 モジュールファイル
認証モジュール
- auth
大元となる認証チェック(パスワードの要求および真偽のチェック)を行い、グループ属性による制限、またはKerberos「チケット」などの「証明書」も設定を行う - account
認証が許可されることをチェックする
具体的には、アカウントの期限切れ、ユーザーがログインする時間帯に制限がないかなどを確認する - password
パスワード設定に使用される - session
認証前後に実行させたい処理を指定する
制御方式
- required
途中のモジュールのいずれかが成功しても失敗しても必ず以降の行のrequiredモジュールを実行する。全てのモジュールが成功した場合のみ、認証成功となる。 - requisite
モジュールの実行に失敗した場合は、この時点で認証を拒否し、以降のモジュールは一切実行しない - sufficient
モジュールの実行に成功した場合、以前の行のrequiredモジュールの実行が全て成功していれば、
その時点で認証を許可する - optional
モジュールの実行に成功または失敗した場合でも、以降の行にあるモジュールの実行を続ける。
モジュールファイル
- pam_securetty.so
rootでのログインを「/etc/securetty」ファイルに記述された端末にのみ許可 - pam_deny.so
認証を全て拒否 - pam_cracklib.so
パスワードの書式を制限し、安全性を向上させる - pam_unix.so
通常のパスワード認証を行う - pam_listfile.so
任意のファイルを用いてプログラムのアクセス制御を行う - pam_limits.so
ユーザが利用するリソースを制限する - pam_warn.so
認証時やパスワードの変更時にログを記録する - pam_wheel.so
root権限のアクセスをwheelグループのメンバーに制限する - pam_nologin.so
/etc/nologinファイルがある場合、一般ユーザのログインを拒否 - pam_console.so
コンソールから一般ユーザでログインした際、管理コマンドやデバイスなどの所有権を一時的に一般ユーザ権限に変更する - pam_env.so
ユーザーログイン時の環境変数を初期設定する - pam_listfile.so
ファイルの内容に基づきサービスを許可または拒否する - pam_pwdb.so
/etc/passwd、/etc/shadow、NIS等を使ったユーザ認証とパスワード変更を行う - pam_rootok.so
それ以上はチェックをせずにrootユーザーによるアクセスを許可する - pam_stack.so
他のPAM設定ファイルをインクルードする - pam_succeed_if.so
特定のアカウント属性をチェックしてサービスを許可する
SELinux
SELinuxとは
Linuxサーバに侵入された場合、root権限を奪取されるとその後は攻撃者の完全に自由に操作ができてしまう。
そこでSELinuxでは、root権限においてもその操作に制限を加えることで、侵入されたとしても被害を抑えることができる。
SELinuxはhttpdやmysqld等の特定デーモンプロセスの権限をポリシー化することで、それに強制的に従わせる。
これはOSレベルで行われるので、rootユーザであっても回避することはできない。
なお、httpd等以外の全てのデーモンプロセスでSELinuxを有効にするよう変更することもできる。
設定
有効/無効化
- 確認
getenforceコマンドでSELinuxが有効になっているかどうかを確認できる。
- 有効
[root@main1 ~]# getenforce Enforcing
- 無効
[root@main1 ~]# getenforce Disabled
- 有効化
下記設定ファイルを編集する
/etc/sysconfig/selinux (-> /etc/selinux/config のリンク)
- 内容サンプル
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
SELINUXの値をenforcingにすることで、有効にできる。
enforcing | SELinuxの有効化 |
permissive | SELinuxは無効だが、警告表示を行う(デバッグ、トラブルシュートなど用) |
disabled | SELinuxの無効化 |
なお、setenforceコマンドで一時的に値を変更できる。ただし、「Enforcing」か「Permissive」にしかできない。
- 書式
setenforce Enforcing
or
setenforce Permissive
対象の設定
SELINUXTYPE値を変更することで、SELinuxを有効にする対象を変更できる。
- targeted
以下のプロセスが対象となる。
- dhcpd
- httpd
- mysqld
- named
- nscd
- ntpd
- portmap
- postgres
- snmpd
- squid
- syslogd
- winbind
- strict
全てのデーモンが対象となる。
ポリシー設定
管理ツールとして以下のコマンドが用意されている。
- semanage
ポリシー管理ツール
- semodule
ポリシー・モジュール管理ツール
- audit2allow
ログからのポリシー生成ツール
OpenSSL
サブコマンド
s_client
- 参考
SSL/TLSクライアントとしてサーバに接続を行う
s_server
- 参考
SSL/TLSサーバとして振る舞い、クライアントからの接続を受け付ける
x509
- 参考
X.509証明書関連の操作を行う
genrsa
- 参考
RSA暗号鍵の生成を行う
rsa
- 参考
RSA暗号に関する処理を行う
verify
- 参考
証明書の検証を行う
req
- 参考
X.509証明書署名要求の生成を行う
crl
- 参考
CRL関連の操作を行う
Tips
RSA鍵ペアの生成
※SSHログイン用には使用できない
- 秘密鍵の作成
openssl genrsa 2048 > id_rsa
- 公開鍵の作成
openssl rsa -pubout < id_rsa > authorized_keys
- 対応確認
- 内容を表示して目視で確認する
openssl rsa -inform pem -in id_rsa -noout -modulus openssl rsa -inform pem -in authorized_keys -pubin -noout -modulus
- 内容を表示せずに自動で確認する
diff <(openssl rsa -inform pem -in id_rsa -noout -modulus) <(openssl rsa -inform pem -in authorized_keys -pubin -noout -modulus)
- 内容を表示して目視で確認する
公開されている証明書の取得
Webサーバなどの公開されているサーバの証明書を取得し、その情報を表示する
openssl s_client -connect <FQDN>:<ポート番号> < /dev/null | openssl x509 -text
- 例
openssl s_client -connect example.com:443 < /dev/null | openssl x509 -text
HTTPSサーバの場合は、curlでも確認できる。
curl -s -v https://<FQDN>/
CA証明書の取得
対象サーバだけでなく、CAの証明書情報も表示する場合は次のように行う
openssl s_client -connect <FQDN>:<ポート番号> -showcerts < /dev/null
検証
取得した証明書を検証する
openssl s_client -connect <FQDN>:<ポート番号> < /dev/null | openssl verify
X509情報の表示
取得した証明書のX509情報を表示する
openssl s_client -connect <FQDN>:<ポート番号> < /dev/null | openssl x509 -text
証明書の検証
取得したSSL証明書が信頼できるか(信頼できる証明機関から署名されているか)検証する。
openssl verify <証明書ファイル>
証明書と秘密鍵の対応確認
モジュール情報を表示し、一致していれば対応している
- 内容を表示して目視で確認する
openssl x509 -modulus -noout -in <証明書ファイル> openssl rsa -modulus -noout -in <秘密鍵ファイル>
- 内容を表示せずに自動で確認する
diff <(openssl x509 -modulus -noout -in <証明書ファイル>) <(openssl rsa -modulus -noout -in <秘密鍵ファイル>) # 差分がない場合は何も表示されない
PEM形式の変換
PEM形式か確認する
openssl x509 -inform PEM -text -noout -in <証明書ファイル> # unable to load certificateと表示されるとPEM形式ではない
CER形式から変換する
openssl x509 -in <CER証明書ファイル> -inform DER -out <PEM証明書ファイル> -outform PEM
Windowsで変換する
証明書ファイルをWindows上でダブルクリックして開き、任意の形式に変換して保存できる
自己署名証明書の作成
- 秘密鍵作成
openssl genrsa 2048 > private.key
- 証明書署名要求
openssl req -new -key private.key > server.csr
証明書情報を対話形式で入力する - 自己署名する
openssl x509 -days 3650 -req -signkey private.key < server.csr > server.crt
Tips
ハッシュ関数コマンド
ファイルを指定してmd5によるハッシュ値計算を行うことができる。
md5 <ファイルパス>
/etc/passwdファイル
形式
<ユーザ名>:<パスワードフィールド(現在は"x")>:<UID>:<GID>:<コメント>:<ホームディレクトリ>:<ログインシェル>
shadowファイルの利用
pwconv pwunconv <ユーザ名>:<ハッシュ化されたパスワード>:<パスワード最終更新日(1970/01/01からの日数)>:<変更できるまでの日数>:<有効日数>:<変更を促すメッセージを表示する日数>