設定 - SSH

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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


OpenSSHのインストール

パッケージ管理システムからインストール

sudo zypper install openssh openssh-server


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

OpenSSHのビルドに必要なライブラリをインストールする。

sudo zypper install autoconf make libcryptopp-devel libfido2-devel ldns-devel libadns-devel udns-devel zlib-devel \
                    libopenssl-devel libopenssl-1_1-devel pam-devel libedit-devel krb5-devel python-devel python3-devel python3-ldns


OpenSSHの公式Webサイトにアクセスして、ソースコードをダウンロードする。


ダウンロードしたファイルを解凍する。

tar xf openssh-<バージョン>.tar.gz
cd openssh-<バージョン>


OpenSSHをビルドおよびインストールする。
もし、"failed to map segment from shared object: Permission denied"とエラーメッセージが出力される場合、SELinuxを無効にする必要がある。

# LDNSライブラリをソースコードからインストールしている場合
export LD_LIBRARY_PATH="/<OpenSSHのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="/<OpenSSHのインストールディレクトリ>/lib64/pkgconfig:$PKG_CONFIG_PATH:(pkg-config --variable pc_path pkg-config)"

autoreconf -i
mkdir build && build
../configure --prefix=<OpenSSHのインストールディレクトリ> \
             --sbindir=/<OpenSSHのインストールディレクトリ>/sbin \
             --libexecdir=/<OpenSSHのインストールディレクトリ>/libexec \
             --sysconfdir=/<OpenSSHのインストールディレクトリ>/etc/ssh \
             --with-pid-dir=/<OpenSSHのインストールディレクトリ>/var \
             --with-privsep-path=/<OpenSSHのインストールディレクトリ>/var/empty \
             --with-ssl-engine --with-pam --with-md5-passwords \
             --with-libedit --with-kerberos5 --with-ldns --with-tcp-wrappers
make -j $(nproc)
make install


もし、最新のLDNSライブラリが必要な場合は、ソースコードからインストールする。

  1. LDNSのビルドに必要なライブラリをインストールする。
    sudo zypper install make libtool libpcap-devel python-devel python3-devel python3-ldns

  2. LDNSの公式WebサイトまたはGithubにアクセスして、ソースコードをダウンロードする。
  3. ダウンロードしたファイルを解凍する。
    tar xf ldns-<バージョン>.tar.gz
    cd ldns-<バージョン>

  4. LDNSをビルドおよびインストールする。
    mkdir build && cd build
    ../configure --prefix=<OpenSSHのインストールディレクトリ> --with-examples --with-drill --with-pyldns
    make -j $(nproc)
    make install



OpenSSHの設定ファイル

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

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



OpenSSHの設定項目

OpenSSH 7.8p1以降では、許可される最小のRSA鍵のサイズが1024ビットになった。
なお、OpenSSH 8.0p1以降では、デフォルトは3072[bit]である。

項目 説明
Port ポート番号

デフォルトは、22
sshdが使用するポート番号
AddressFamily any
inet
inet6

デフォルトは、any
sshdをIPv4、IPv6、IPv4とIPv6の両方のいずれかで有効にする。
ListenAddress host
IPv4のIPアドレス または IPv4のIPアドレス:<ポート番号>
IPv6のIPアドレス または IPv6のIPアドレス:<ポート番号>

デフォルトは、以下の2つのアドレスである。
[::]:22
0.0.0.0:22
sshdが接続を受け付けるローカルアドレスを指定する。
Portが未指定の場合は、[Port]項目で指定したポート番号に対してListenする。
Protocol 1
2
1,2
sshdがサポートするSSHのプロトコルバージョン。
SSH1のみを使用する場合は1、SSH2のみを使用する場合は2、
両方使用する場合は"1,2"と設定する。

OpenSSH 7.4以降では、廃止された。
Hostkey SSHサーバに保存している秘密鍵のファイルのパス

デフォルトは、以下の3つのファイルである。
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ed25519_key
SSHで使用する秘密鍵が格納されているファイルのパスを指定する。
rekeylimit 第1項目: 整数値(通信データ量)またはdefault
K、M、Gのサフィックスも使用可能

第2項目: 整数値または時間(週、日、時、分、秒)またはnone
第2項目において、分で使用する場合は、5m等と記述する。(この場合は、5分)
時で使用する場合は、1h等と記述する。(この場合は、1時間)

その他、sSmMhHdDwWが使用できる。
また、これらを組み合わせて使用することもできる。(1h30m等)

デフォルトは、第1項目は0、第2項目は0
SSHは、通信を暗号化するためにホストとクライアント間でセッション鍵を交換している。
暗号化を堅牢に行うために都度鍵を変更している。

第1項目にdefaultを指定する場合、1[GB]から4[GB]の間の適切なタイミングで再生成を行う。

第2項目の0noneと等価である。
KeyRegenerationInterval 時間(秒) SSH1では、サーバ鍵を指定した間隔ごとに自動的に再生成される。
その自動的に鍵を再生成する間隔を指定する。

OpenSSH 7.x以降では、廃止された。
ServerKeyBits ビット数 SSH1で使用されるサーバ鍵のビット数。(SSH2では無効)
最小値は512で、デフォルトは1024。
なお、ServerKeyBitsが対象としている鍵は、ephemeral keyである。(生成されたホスト鍵ではない)

現在のOpenSSHでは、廃止された。
SyslogFacility ファシリティ名:
DAEMON (デーモンのログメッセージ)
USER (ユーザのログメッセージ)
AUTH (認証関連のログメッセージ)
LOCAL0 (LOCAL0〜LOCAL7は、ソフトウェア開発者が独自に定義することができるカテゴリ)
LOCAL1
LOCAL2
LOCAL3
LOCAL4
LOCAL5
LOCAL6
LOCAL7

デフォルトは、AUTH
sshdがsyslogサーバに出力するログメッセージのファシリティ(分類)を指定する。
例えば、DAEMONを指定する場合、SSHのログメッセージはsyslogの"daemon"カテゴリに分類される。
LogLevel QUIET (メッセージを出力しない)
FATAL ( 致命的なエラーのみを出力)
ERROR (致命的なエラーと重要なエラーを出力)
INFO (重要な情報と警告を出力)
VERBOSE (全ての情報を出力)
DEBUG (デバック情報を出力)
DEBUG1 (DEBUGと同等)
DEBUG2 (より高いレベルのデバッグ情報)
DEBUG3 (最も高いレベルのデバッグ情報)

デフォルトは、INFO
sshdが出力するログのログレベル(冗長レベル)を指定する。
DEBUGレベルでのログ出力は、ユーザのプライバシーを侵害するため、推奨されない。
LoginGraceTime 時間(週、日、時、分、秒)
分で使用する場合は、5m等と記述する。(この場合は、5分)
時で使用する場合は、1h等と記述する。(この場合は、1時間)

その他、sSmMhHdDwWが使用できる。
また、これらを組み合わせて使用することもできる。(1h30m等)

デフォルトは、120
ユーザが指定時間内にログインできない場合、サーバの接続を自動的に切断する。
PermitRootLogin yes
no
prohibit-password
(without-passwordと同様であるが、without-passwordは非推奨)
forced-commands-only

デフォルトは、yes
rootでのログインを許可するかどうかを指定する。

yesの場合、rootユーザで直接SSHログインが可能になる。

noの場合、rootユーザでの直接SSHログインが禁止する。

prohibit-password(または、非推奨のエイリアスであるwithout-password)は、
rootに対してパスワード認証およびキーボード対話型認証が無効になる。

forced-commands-onlyは、rootユーザの直接ログインを拒否する(公開鍵認証によるrootログインが許可される)が、
root権限を使用するコマンドのアクセスは許可する。
例えば、rootログインが通常許可されない場合でも、リモートバックアップを取るのに便利な場合がある。
ただし、forced-commands-onlyは、他の全ての認証方法において、rootに対して無効になることに注意する。
StrictModes yes
no
デフォルトは、yes
ログイン前にユーザのディレクトリやファイルのパーミッションをチェックする。
MaxAuthTries 整数値
デフォルトは、6
認証の再試行最大数。
指定値の半数以上の認証が失敗する時、それ以降の失敗はログに記録される。
MaxSessions 整数値
デフォルトは、10
最大同時接続数
RSAAuthentication yes
no
RSA認証を有効にする。
RSA認証は、SSH1のみ有効にすることができる。

現在のOpenSSHでは、廃止された。
PubkeyAuthentication yes
no
デフォルトは、yes
公開鍵認証を許可する。
AuthorizedKeysFile SSHサーバに保存されている公開鍵ファイルのパス

デフォルトは、以下の2つのファイルである。
.ssh/authorized_keys
.ssh/authorized_keys2
ユーザ認証の際に使用される公開鍵を格納しているファイル名を指定する。
絶対パス、または、ユーザのホームディレクトリからの相対パスで指定する。
AuthorizedKeysCommand コマンド

デフォルトは、none
公開鍵を取得するために使用するコマンドを指定する。
AuthorizedKeysCommandUser ユーザ名

デフォルトは、none
AuthorizedKeysCommand項目で指定したコマンドを実行する時のユーザを指定する。
PubkeyAuthOptions 1つまたは複数の公開鍵認証オプションを指定する。
none
touch-required
verify-required

デフォルトは、none
noneは、authorized_keysオプションで上書きされない限り、ユーザの存在を要求する。

touch-requiredオプションは、FIDO認証アルゴリズム(ecdsa-skまたはed25519-sk)を使用する公開鍵認証であり、
存在するユーザが明示的に認証を確認したことを証明する署名を常に要求する。
また、authorized_keysオプションでの上書きは無効になる。

verify-requiredオプションは、PIN等でユーザが認証されたことを証明するFIDO鍵の署名を要求する。

touch-requiredオプションおよびverify-requiredオプションは、他の非FIDO公開鍵タイプには効果がないことに注意する。
RhostsRSAAuthentication yes
no
デフォルトは、no
RSA認証が成功した時、rhostsや/etc/hosts.equivを使用した認証を許可する。
SSH1の場合のみ有効である。

現在のOpenSSHでは、廃止された。
HostbasedAuthentication yes
no
デフォルトは、no
公開鍵認証が成功した時、rhostsあるいは/etc/hosts.equiv認証を許可する。
(ホストベースド認証)
IgnoreUserKnownHosts yes
no
デフォルトは、no
RhostsRSAAuthenticationまたはHostbasedAuthenticationの各認証で、
ユーザの~/.ssh/known_hostsファイルを使用しないようにする。
IgnoreRhosts yes
no
デフォルトは、yes
RhostsRSAAuthenticationまたはHostbasedAuthenticationの各認証で、
.rhostsおよび.shostsを使用しないようにする。
PasswordAuthentication yes
no
デフォルトは、yes
パスワード認証を許可する。
RFC 4252で定義されている"Password Authentication Method (password)"を有効にする。
クライアントがユーザ名とパスワードをサーバに送信して、サーバは成功または失敗を返す。
PermitEmptyPasswords yes
no
デフォルトは、no
パスワード認証を許可している時、
パスワードが空のアカウントに対してサーバがログインを許可するかどうかを指定する。
ChallengeResponseAuthentication yes
no
デフォルトは、yes
チャレンジレスポンス認証を許可する。
RFC 4256で定義されている"Generic Message Exchange Authentication (keyboard-interactive)"認証を有効にする。

まず、クライアントがサーバにユーザ名のみを送信する。
それに対して、サーバがクライアントにinstructionやprompt等を送信して、クライアントが応答する。
認証に必要な回数だけ、サーバはクライアントとやり取りすることが出来る。

PAMを使用して認証するという前提の実装であるため、UsePAMがNoの場合は認証に失敗する。
KbdInteractiveAuthentication yes
no
デフォルトは、yes
キーボード対話型認証を許可するかどうかを指定する。
login.confにある全ての認証に対応している。

ChallengeResponseAuthenticationオプションは、このキーワードの非推奨の別称である。
KerberosAuthentication yes
no
デフォルトは、no
ケルベロス認証を許可する。
KerberosOrLocalPasswd yes
no
デフォルトは、yes
ケルベロス認証で失敗した場合は、ローカルパスワードで認証する。
KerberosTicketCleanup yes
no
デフォルトは、yes
ログアウト時、ケルベロス認証用のキャッシュを自動的に削除する。
KerberosGetAFSToken yes
no
デフォルトは、no
ケルベロス認証において、AFSが有効であり、ユーザがKerberos 5のTGTを持っている場合、
ユーザのホームディレクトリにアクセスする前に、AFSトークンの取得を試みる。

現在のOpenSSHでは、非推奨となっている。
代わりに、GSSAPIを使用することが推奨されている。
GSSAPIは、標準のセキュリティ技術を利用して、認証と暗号化を統合することができる。
KerberosUseKuserok yes
no
デフォルトは、yes
ケルベロス認証で、.k5loginファイルが存在する場合は使用する。

現在のOpenSSHでは、廃止された。
GSSAPIAuthentication yes
no
デフォルトは、no
GSSAPIベースのユーザ認証を使用する。

これは、SSHの認証方法の1つであり、Kerberosを利用する認証方式を示す。
これは、GSSAPI(Generic Security Services API)を使用して認証を行う。
この認証方式を使用することにより、ユーザ名とパスワードの代わりにKerberosトークンを使用して認証を行う。

SSH2の場合のみ適用される。
GSSAPICleanupCredentials yes
no
デフォルトは、yes
ユーザがログアウトする時、その証明書キャッシュを自動的に消去する。
SSH2の場合のみ適用される。
GSSAPIStrictAcceptorCheck yes
no
デフォルトは、yes
GSSAPIアクセプタのチェックを厳格に行う。
GSSAPIKeyExchange yes
no
デフォルトは、no
GSSAPIを許可するために鍵交換を行う。
GSSAPIStoreCredentialSonreKey yes
no
デフォルトは、no
SSHクライアントがGSSAPI(Generic Security Services API)を通して取得した認証情報を、
将来の鍵交換操作のために保存するかどうかを決定する。

yes
クライアントは同じホストへの次回接続時に、毎回認証を求めるのではなく、保存された認証情報を再利用する。
これにより、認証要求の回数を減らすことで認証プロセスを改善し、
認証情報をクライアントPCに安全に保存することにより、セキュリティを向上させることができる。

no
SSHクライアントが、GSSAPIを通じて取得した資格情報を保存せずに、毎回認証を要求することを示す。
GSSAPIKexAlgorithms 指定できるアルゴリズムを、以下に示す。
・ gss-gex-sha1-
・ gss-group1-sha1-
・ gss-group14-sha1-

デフォルトは、gss-gex-sha1-,gss-group14-sha1-
GSSAPI(Generic Security Services API)を使用して鍵交換を行うアルゴリズムの種類を指定する。

GSSAPIを使用することにより、安全な認証と鍵交換を行うことができるが、
使用するアルゴリズムによっては、安全性や速度などに差があるため、この設定において使用するアルゴリズムを選択することができる。

この項目は、サーバ側とクライアント側の両方で設定する必要がある。
また、使用するアルゴリズムの種類により、互換性の問題が生じる可能性もあるため、注意が必要である。
UsePAM yes
no
デフォルトは、no
PAM(Pluggable Authentication Module)インターフェースによる認証を許可する。

当設定をyesに設定する場合、
PasswordAuthentication、または、ChallengeResponseAuthenticationのいずれかを許可する必要がある。
その時、sshdコマンドをroot以外の一般ユーザで実行することはできなくなる。

また、yesに設定すると、PAMアカウントおよびセッションモジュールの処理に加えて、
KbdInteractiveAuthenticationオプションおよびPasswordAuthenticationオプションを使用した
PAM認証を全ての認証タイプで使用できるようになる。

PAMのキーボード対話型認証は、通常はパスワード認証と同等の役割を果たすため、
PasswordAuthenticationオプションあるいはKbdInteractiveAuthenticationオプションのいずれかを
無効にしておく必要がある。
FingerprintHash MD5またはSHA256が指定できる。

デフォルトは、SHA256
フィンガープリントを記録する時に使用するハッシュアルゴリズムを指定する。

OpenSSH 6.8以降に追加された項目である。
OpenSSH 6.7以前では、強制的にMD5となる。
AcceptEnv 環境変数を記述する。
デフォルトは、空
クライアントから送信されてきた環境変数のうち、有効にするものを指定する。

変数は名前で指定され、名前にはワイルドカード文字*?を含めることができる。
複数の環境変数を空白で区切ったり、複数の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のみ許可する。
PermitTTY yes
no
デフォルトは、yes
ptyの割り当てを許可するかどうかを指定する。
PrintMotd yes
no
デフォルトは、yes
ログイン時に/etc/motdの内容を表示する。
PrintLastLog yes
no
デフォルトは、yes
ログイン時に前回ログインした日時と時刻を表示する。
TCPKeepAlive yes
no
デフォルトは、yes
TCPキープアライブメッセージを送信する。
UseLogin yes
no
デフォルトは、no
ログインでloginプログラムを使用する。

現在のOpenSSHでは、廃止された。
UsePrivilegeSeparation yes
no
デフォルトは、yes
sshdがセッションを受け付けるネットワークトラフィックを処理するためにroot権限を分離する。

OpenSSH 7.8p1以降では、UsePrivilegeSeparationは、sandboxオプションが必須になったため、
設定は変更できない。
PermitUserEnvironment yes
no
デフォルトは、no
ユーザの環境変数の変更を許可する。
Compression yes(deayed)
no
デフォルトは、yes

delayedは、yesの従来のシノニムである。
圧縮を許可する。
デフォルトでは、ユーザが認証されてから圧縮を許可する。(delayed)
ClientAliveInterval 整数値
デフォルトは、0
クライアントからデータを受信しなかった場合、sshdが暗号化チャネルを介してメッセージを送信し、
クライアントからの応答を要求するまでのタイムアウト間隔を秒数で設定する。

0を指定する場合、メッセージはクライアントに送信されないことを意味する。

デフォルトは、チェックしない。(0)
ClientAliveCountMax 整数値
デフォルトは、3
sshdがクライアントからメッセージを受信せずに送信できるクライアント生存確認メッセージの数を指定する。
クライアント生存確認メッセージの送信中にこの閾値に達した場合、sshdはクライアントを切断して、セッションを終了する。

クライアント生存確認メッセージの使用は、TCPKeepAliveと大きく異なることに注意する。

クライアント生存確認メッセージは、暗号化されたチャネルを介して送信されるため、なりすましはできない。
TCPKeepAliveで有効なTCPkeepaliveオプションは、なりすましが可能である。
クライアント生存確認メカニズムは、クライアントまたはサーバが、接続が応答しなくなったときを知ることに依存している場合に価値がある。

例えば、ClientAliveIntervalを15に設定し、ClientAliveCountMaxをデフォルトのままにする場合、
無応答のクライアントは約 45秒後に切断される。
ClientAliveCountMaxを0に設定する場合、接続の終了が無効になる。
ShowPatchLevel yes
no
デフォルトは、no
セッション確立時にクライアントにOpenSSHのパッチレベルを通知する。

OpenSSH 8.0p1以降では、当オプションは無効になった。
UseDNS yes
no
デフォルトは、yes
DNSを使用してリモートホスト名を確認する。
PidFile PIDファイルのパス
デフォルトは、/run/sshd.pid
PIDファイルの出力先を指定する。
MaxStartups 整数値
デフォルトは、10:30:100
sshdが認証成功までの接続を受け付ける最大数を指定する。
PermitTunnel yes
no
デフォルトは、no
トンネリングを許可する。
ChrootDirectory chrootを行うディレクトリのパス
デフォルトは、none
chrootを行うディレクトリのパス名を指定する。
Banner 文字列
デフォルトは、none
セッション確立時に表示する文字列を指定する。
VersionAddendum 文字列
デフォルトは、none
接続時にサーバから送信されるSSHプロトコルバナーに付加する追加のテキストを指定する。
Subsystem

第1引数
サブシステム名 (一部抜粋)
・ sftp
SFTPプロトコルを実行するためのサブシステム

・ scp
SCPプロトコルを実行するためのサブシステム

・ shell
リモートシェルを実行するためのサブシステム

・ exec
リモートシェルに対してコマンドを実行するためのサブシステム

・ sftp-server
外部のSFTPサーバを指定して、SFTPサブシステムを実行するために使用する。

・ internal-sftp
内部的なSFTP実装を使用して、SFTPサブシステムを実行するために使用する。
これは、外部のSFTPサーバを使用せずに、SSHサーバ自身に内蔵されたSFTPサブシステムを使用する。

第2引数
サブシステムに要求があった場合に実行されるコマンドのパス(および、必要な場合はその引数)を指定する。

第3引数
第2引数に渡す引数を指定する。

デフォルトは、空

ユーザがログインした時にサーバ上で起動される外部プログラムを指定する。

サブシステムは、SSH接続のコンテキストでサーバ上で実行される独立した別個のプログラムである。
サブシステムは、SFTPのような追加機能、および、シェルセッションを開始せずに、
サーバ上でコマンドを実行する方法を提供する。

これは、サブシステム名、コマンド名(サーバ上で実行されるプログラム名と一致しなければならない)、
そのプログラムに渡す引数を指定する。

サブシステム名にsftp-serverおよびinternal-sftpを指定することにより、
ChrootDirectoryを使用してクライアントに別のファイルシステムルートを強制する構成が
簡素化される場合がある。
また、両方のオプションを使用することにより、特定のSFTPサブシステムを指定することができる。
Match デフォルトは、空 条件に一致した場合の処理を指定する条件分岐を行う。



設定ファイルの確認

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

sudo sshd -t


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

sudo sshd -T


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

sudo sshd -t -f <sshd_configファイルのパス>
# または
sudo sshd -T -f <sshd_configファイルのパス>



設定ファイルのデフォルト値

SSHの設定ファイルにおけるデフォルト値を取得する。

sudo sshd -T -f /dev/null



OpenSSHのパスワード認証

RHELおよび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



画面転送

X11

X11では、SSH転送をサポートしている。

# /etc/ssh/sshd_configファイル

X11Forwarding    yes
X11DisplayOffset 10
X11UseLocalhost  yes


ssh -X <ユーザ名>@<ホスト名またはIPアドレス>  # 基本的なX11転送
ssh -Y <ユーザ名>@<ホスト名またはIPアドレス>  # 信頼されたX11転送 (セキュリティ制限が緩和)


Wayland

Waylandは、SSHを使用した画面転送をネイティブにサポートしていない。
しかし、以下に示す方法で実現することが可能である。

Xwaylandを使用している場合

ただし、サーバ側でXWaylandが必須となる。

ssh -X user@hostname


Weston RDPバックエンドを使用している場合

# サーバ側
weston --backend=rdp

# クライアント側
wlfreerdp /v:<ホスト名またはIPアドレス>


Waylandを使用している場合

Waylandでは、waypipeが最も推奨される方法である。

まず、waypipeをインストールする。

# RHEL
sudo dnf install 

# SUSE
sudo zypper install 

# Debian GNU/Linux, Raspberry Pi, Mobian
sudo apt install waypipe


waypipeを使用する。

waypipe ssh <ユーザ名>@<ホスト名またはIPアドレス> <アプリケーションのパス>



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接続できるようになる。

パッケージ管理システムを使用してインストール
# RHEL
sudo dnf install epel-release
sudo dnf update
sudo dnf 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アドレス>



SSH接続のテストコマンド

タイムアウトの使用

ポートのステータスを確認することにより、SSH接続をテストする。

timeout <時間 [sec]> bash -c "< /dev/tcp/<サーバのIPアドレスまたはホスト名>/<ポート番号>"

例:
timeout 5 bash -c "< /dev/tcp/server2/22"


終了ステータスを確認する。
終了ステータスが0の場合、SSH接続のテストが成功したことを意味する。

echo $?


nmapの使用

nmapはポートの状態を確認する時によく使用されている。

nmap <サーバのIPアドレスまたはホスト名> -PN -p ssh | grep -E 'open|closed|filtered'


netcatまたはncの使用

ncとncatを使用して、ポートの状態を確認、および、SSH接続をテストすることができる。

nc --wait <時間 [sec]> <サーバのIPアドレスまたはホスト名> <ポート番号> < /dev/null &> /dev/null


終了ステータスを確認する。
終了ステータスが0以外の場合、SSH接続に失敗している。

echo $?


SSHコマンドの使用

パスワード無しでSSH接続を行う場合、接続を確認するためにsshコマンドを使用することができる。
ConnectTimeoutオプションを付加して、SSHがアクティブになるまでの接続待ち状態でフリーズしないようにする。
StrictHostKeyCheckingオプションを付加して、セキュリティとフィンガープリントのプロンプトが表示されないようにする。
BatchModeオプションがyesの場合、パスフレーズ / パスワード照会は無効になる。

パスワードを使用している場合、コマンドはパスワードの入力を要求するため、sshpassやexpectスクリプト等を使用しない限り自動化できない。

# SSH接続に成功した場合は、0を指定している
ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=<時間 [sec]> <サーバのIPアドレスまたはホスト名> 'exit 0'


終了ステータスを確認する。

echo $?



エラー

接続エラー : client_loop: send disconnect: Broken pipe

SSH接続が予期せず切断されたことを示している。

このエラーには、以下に示すような様々な原因が考えられる。

  • ネットワークの問題
    不安定なネットワーク接続
    ファイアウォールやルータの設定

  • サーバ側の問題
    サーバの負荷が高い。
    SSHの設定 (例: タイムアウト設定が短い等)

  • クライアント側の問題
    ローカルのネットワーク設定
    SSHクライアントの設定

  • セキュリティソフトウェアの干渉
    アンチウイルスソフトやファイアウォールが接続を遮断している可能性


対処方法を以下に示す。

  • 接続を再試行する
    単純なネットワークの一時的な問題である可能性がある。

  • 別のネットワークから接続を試みる
    ローカルネットワークの問題を切り分ける。

  • SSHの冗長モードを使用する
    -vvvオプションを付加して、sshコマンドを実行すると、詳細なデバッグ情報が得られる。
    ssh -vvv <ユーザ名>@<ホスト名またはIPアドレス>

  • クライアント側のSSH設定を確認する
    ~/.ssh/configファイルにServerAliveInterval 60を追記して、定期的にキープアライブパケットを送信することにより、接続を維持しやすくなる。

  • サーバ管理者に連絡する
    サーバ側の設定や負荷状況を確認してもらう。

  • ファイアウォールやセキュリティソフトの設定を確認する
    SSHトラフィックが阻害されていないか確認する。


このエラーの正確な原因を特定するには、より詳細な情報 (サーバのOS、SSHクライアントのバージョン、ネットワーク環境等) が必要となる。