設定 - SSH

提供:MochiuWiki : SUSE, EC, PCB
2022年12月5日 (月) 00:55時点におけるWiki (トーク | 投稿記録)による版 (→‎OpenSSHのパスワード認証)
ナビゲーションに移動 検索に移動

概要

SSHサーバを構成し、リモート端末からサーバに接続して操作できるようにする。
SSHサーバは、CentOSをMinimal Installした場合やopenSUSEを最小インストールした場合でも、標準でOpenSSHがインストールされるため、追加インストールする必要はない。


OpenSSHの設定ファイル

OpenSSHの主な設定ファイルは、以下に示す2つのファイルである。

  • /etc/ssh/sshd_config
    SSH(SSHサーバ)の設定ファイル
  • /etc/ssh/ssh_config
    システム共通のSSH(SSHクライアント)の設定ファイル
  • ~/.ssh/config
    各ユーザごとのSSH(SSHクライアント)の設定ファイル
    ~/.ssh/configファイルの設定が優先される。



OpenSSHの設定項目

項目 説明
Port ポート番号 sshdが使用するポート番号
AddressFamily any
inet
inet6
sshdをIPv4、IPv6、IPv4とIPv6の両方のいずれかで有効にする。
ListenAddress host
IPv4のIPアドレス または IPv4のIPアドレス:<ポート番号>
IPv6のIPアドレス または IPv6のIPアドレス:<ポート番号>
sshdが接続を受け付けるローカルアドレスを指定する。
Portが未指定の場合は、[Port]項目で指定したポート番号に対してListenする。
Protocol 1
2
1,2
sshdがサポートするSSHのプロトコルバージョン。
SSH1のみを使用する場合は1、SSH2のみを使用する場合は2、
両方使用する場合は"1,2"と設定する。
Hostkey SSHサーバに保存している秘密鍵のファイルのパス SSHで使用する秘密鍵が格納されているファイルのパスを指定する。
KeyRegenerationInterval 時間(秒) SSH1では、サーバ鍵を指定した間隔ごとに自動的に再生成される。
その自動的に鍵を再生成する間隔を指定する。
ServerKeyBits ビット数 SSH1で使用されるサーバ鍵のビット数。
最小値は512で、デフォルトは1024。
SyslogFacility ファシリティ名
デフォルトは、AUTH
sshdがsyslogサーバに出力するログメッセージのファシリティ(分類)を指定する。
LogLevel QUITE
FATAL
ERROR
INFO
VERBOSE
DEBUG
DEBUG1
DEBUG2
DEBUG3
sshdが出力するログのログレベルを指定する。
LoginGraceTime 時間(秒) ユーザが指定時間内にログインできない場合、サーバの接続を自動的に切断する。
PermitRootLogin yes
no
without-password
forced-commands-only
rootでのログインを許可するかどうかを指定する。
without-passwordは、パスワードを使用したrootユーザのログインを拒否する。
forced-commands-onlyは、rootユーザの直接ログインを拒否するが、root権限を使用するコマンドのアクセスは許可する。
StrictModes yes
no
デフォルトは、yes
ログイン前にユーザのディレクトリやファイルのパーミッションをチェックする。
MaxAuthTries 整数値
デフォルトは、6
認証の再試行最大数。
指定値の半数以上の認証が失敗する時、それ以降の失敗はログに記録される。
MaxSessions 整数値
デフォルトは、10
最大同時接続数
RSAAuthentication yes
no
RSA認証を有効にする。
RSA認証は、SSH1のみ有効にすることができる。
PubkeyAuthentication yes
no
デフォルトは、yes
公開鍵認証を許可する。
AuthorizedKeysFile SSHサーバに保存されている公開鍵ファイルのパス ユーザ認証の際に使用される公開鍵を格納しているファイル名を指定する。
絶対パス、または、ユーザのホームディレクトリからの相対パスで指定する。
AuthorizedKeysCommand コマンド 公開鍵を取得するために使用するコマンドを指定する。
AuthorizedKeysCommandRunAs ユーザ名 AuthorizedKeysCommand項目で指定したコマンドを実行する時のユーザを指定する。
RhostsRSAAuthentication yes
no
デフォルトは、no
RSA認証が成功した時、rhostsや/etc/hosts.equivを使用した認証を許可する。
SSH1の場合のみ有効である。
HostbasedAuthentication yes
no
デフォルトは、no
公開鍵認証が成功した時、rhostsあるいは/etc/hosts.equiv認証を許可する。
(ホストベーストド認証)
IgnoreUserKnownHosts yes
no
デフォルトは、no
RhostsRSAAuthenticationまたはHostbasedAuthenticationの各認証で、
ユーザの~/.ssh/known_hostsファイルを使用しないようにする。
IgnoreRhosts yes
no
デフォルトは、no
RhostsRSAAuthenticationまたはHostbasedAuthenticationの各認証で、
.rhostsおよび.shostsを使用しないようにする。
PasswordAuthentication yes
no
デフォルトは、yes
パスワード認証を許可する。
PermitEmptyPasswords yes
no
デフォルトは、no
パスワード認証を許可している時、
パスワードが空のアカウントに対してサーバがログインを許可するかどうかを指定する。
ChallengeResponseAuthentication yes
no
デフォルトは、yes
チャレンジレスポンス認証を許可する。
KerberosAuthentication yes
no
デフォルトは、no
ケルベロス認証を許可する。
KerberosOrLocalPasswd yes
no
デフォルトは、yes
ケルベロス認証で失敗した場合は、ローカルパスワードで認証する。
KerberosTicketCleanup yes
no
デフォルトは、yes
ログアウト時、ケルベロス認証用のキャッシュを自動的に削除する。
KerberosGetAFSToken yes
no
デフォルトは、no
ケルベロス認証で、AFSトークンを取得する。
KerberosUseKuserok yes
no
デフォルトは、yes
ケルベロス認証で、.k5loginファイルが存在する場合は使用する。
GSSAPIAuthentication yes
no
デフォルトは、no
GSSAPIベースのユーザ認証を使用する。
SSH2の場合のみ適用される。
GSSAPICleanupCredentials yes
no
デフォルトは、yes
ユーザがログアウトする時、その証明書キャッシュを自動的に消去する。
SSH2の場合のみ適用される。
GSSAPIStrictAcceptorCheck yes
no
デフォルトは、yes
GSSAPIアクセプタのチェックを厳格に行う。
GSSAPIKeyExchange yes
no
デフォルトは、no
GSSAPIを許可するために鍵交換を行う。
UsePAM yes
no
デフォルトは、no
PAM(Pluggable Authentication Module)インターフェースによる認証を許可する。
AcceptEnv 環境変数 クライアントから送信されてきた環境変数のうち、有効にするものを指定する。
AllowAgentForwarding yes
no
デフォルトは、yes
ssh-agentによるエージェント転送を許可する。
AllowTcpForwarding yes
no
デフォルトは、yes
TCP転送を許可する。
GatewayPorts yes
no
デフォルトは、no
ポート中継を許可する。
X11Forwarding yes
no
デフォルトは、no
X11転送を許可する。
X11DisplayOffset 整数値
デフォルトは、10
X11転送をする場合に最初に使用されるディスプレイ番号。
X11UseLocalhost yes
no
デフォルトは、yes
X11をlocalhostのみ許可する。
PrintMotd yes
no
デフォルトは、yes
ログイン時に/etc/motdの内容を表示する。
PrintLastLog yes
no
デフォルトは、yes
ログイン時に前回ログインした日時と時刻を表示する。
TCPKeepAlive yes
no
デフォルトは、yes
TCPキープアライブメッセージを送信する。
UseLogin yes
no
デフォルトは、no
ログインでloginプログラムを使用する。
UsePrivilegeSeparation yes
no
デフォルトは、yes
sshdがセッションを受け付けるネットワークトラフィックを処理するためにroot権限を分離する。
PermitUserEnvironment yes
no
デフォルトは、no
ユーザの環境変数の変更を許可する。
Compression yes
no
デフォルトは、delayed
圧縮を許可する。
デフォルトでは、ユーザが認証されてから圧縮を許可する。(delayed)
ClientAliveInterval yes
no
デフォルトは、0
クライアントの生存チェック間隔を指定する。
デフォルトは、チェックしない。(0)
ClientAliveCountMax yes
no
デフォルトは、3
クライアントの生存チェック最大カウント数を指定する。
ShowPatchLevel yes
no
デフォルトは、no
セッション確立時にクライアントにOpenSSHのパッチレベルを通知する。
UseDNS yes
no
デフォルトは、yes
DNSを使用してリモートホスト名を確認する。
PidFile PIDファイルのパス
デフォルトは、/var/run/sshd.pid
PIDファイルの出力先を指定する。
MaxStartups 整数値
デフォルトは、10
sshdが認証成功までの接続を受け付ける最大数を指定する。
PermitTunnel yes
no
デフォルトは、no
トンネリングを許可する。
ChrootDirectory chrootを行うディレクトリのパス
デフォルトは、none
chrootを行うディレクトリのパス名を指定する。
Banner 文字列
デフォルトは、none
セッション確立時に表示する文字列を指定する。
Subsystem 外部サブシステムを指定する。
Match 条件に一致した場合の処理を指定する条件分岐を行う。



設定ファイルの確認

SSHの設定ファイルの正当性を確認する。

sudo sshd -t


-Tオプションを付加することにより、SSHの設定ファイルの正当性を確認して、有効な設定項目を標準出力に表示することができる。

sudo sshd -T



OpenSSHのパスワード認証

CentOSおよびSUSEでは、SSHは標準で自動起動設定になっているため、パスワード認証方式でのログインが可能となっている。
したがって、最低限必要な設定として、セキュリティを考慮して以下に示すようにrootアカウントの直接ログインの禁止設定を実施しておけばよい。

まず、SSHの設定を行う。

sudo nano /etc/ssh/sshd_config
PermitRootLogin no  # コメントを解除(rootログイン禁止)


次に、上記で行ったSSHの設定を反映させるため、sshdを再起動する。

sudo systemctl restart sshd


もし、Firewalldを有効にしている場合は、SSHサービスの許可が必要である。
なお、ポート番号の変更をしていない場合、SSHのポートはTCP 22番である。

sudo firewall-cmd --permanent --add-service=ssh


Firewalldの設定を反映させるため、Firewalldを再起動する。

sudo firewall-cmd --reload



SSHのポート番号の変更

SSH接続ではデフォルトでポート番号22を使用している。
以下のコマンドを実行し、ポート番号の変更を行う。
Port 22と記載している箇所が存在するので、ポート番号49152 - 65535の間のポート番号に変更して保存する。

sudo nano /etc/ssh/sshd_config


次に、上記で行ったSSHの設定を反映させるため、sshdを再起動する。

sudo systemctl restart sshd


Firewalldを有効にしている場合は、SSHサービスのポート番号を開放する。

sudo firewall-cmd --permanent --add-port=<変更したSSHのポート番号>/tcp


Firewalldの設定を反映させるため、Firewalldを再起動する。

sudo firewall-cmd --reload



SSH接続中のサスペンドの無効化

GNOME / KDE

SSH接続されているPCは無操作状態とみなされて、サスペンドの設定をしている場合、所定の時間が経過するとサスペンドされる。
そのため、SSH接続中のユーザが存在する時はサスペンドしないように設定する必要がある。

まず、/usr/lib/systemd/systemディレクトリにsystemdユニットファイルを作成する。

これは、スリープフックと呼ばれるものであり、スリープまたはハイバネートする前にExecStartで指定したコマンドが実行される。
まず、whoコマンドを実行することにより、SSH接続中のユーザが存在するかどうか確認する。
もし、SSH接続中のユーザが存在する場合は、終了コードを0以外にして後続処理を動作させないようにする。

sudo vi /usr/lib/systemd/system/inhibit-sleep.service


# /usr/lib/systemd/system/inhibit-sleep.serviceファイル

[Unit]
Description=Inhibit sleep when ssh logged
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c '! who | grep -q "(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\})"'

[Install]
RequiredBy=sleep.target


以下のシンボリックリンクを作成する。

sudo ln -s /usr/lib/systemd/system/inhibit-sleep.service /etc/systemd/system/


コマンドでsystemdユニットファイルを有効にするため、以下のコマンドを実行する。

sudo systemctl enable inhibit-sleep.service


動作確認するには、システムログを確認する。
サスペンドした場合はReached target Sleep.、サスペンドから復帰した場合はStopped target Sleep.と表示される。

sudo journalctl -f -usleep.target


GNOME

ソフトウェアの使用中にも関わらず、スクリーンセーバーまたはサスペンドが作動するものがある。
このような場合、gnome-session-inhibitツールを使用して、サスペンド等を防止する。

これを行うには、~/.bashrcファイル等の最下行に以下の設定を追記する。

 if [[ -n $SSH_CONNECTION ]]; then
    : $(gnome-session-inhibit --inhibit suspend --reason "SSH connection is active" --inhibit-only) &
 fi



SSHPassのインストール

SSHPass(Non-interactive SSH Password Authentication)を使用すると、コマンドにてssh接続のパスワードを指定することができるので、
sshコマンドと合わせて1行でSSH接続できるようになる。

パッケージ管理システムを使用してインストール
# CentOS
sudo yum install epel-release
sudo yum update
sudo yum install sshpass

# SUSE
sudo zypper install sshpass


ソースコードからインストール

SourceForgeのWebサイトからSSHPassのソースコードをダウンロードする。
https://sourceforge.net/projects/sshpass/

ダウンロードしたファイルを解凍して、任意のディレクトリに移動する。(ここでは、sshpassというディレクトリとする)

tar xf sshpass-<バージョン>
cd ~/sshpass-<バージョン>


ビルドディレクトリを作成する。

mkdir build && cd build


SSHPassをビルドおよびインストールする。

../configure --prefix=<SSHPassのインストールディレクトリ>
make -j $(nproc)
make install


.profileファイル等に環境変数PATHを追加する。

export PATH="$HOME/SSHPass/bin:$PATH"


確認

以下のコマンドを実行して、SSHPassが正常にインストールできたか確認する。

sshpass -V


使用方法

SSHPassを使用して、パスワードを指定する例を示す。
ただし、初回のログインにおいて、使用できない場合があるので注意すること。

sshpass -p <パスワード> ssh <ユーザ名>@<ホスト名またはIPアドレス>