設定 - SSH
概要
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サイトにアクセスして、ソースコードをダウンロードする。
- https://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/
- https://www.ftp.ne.jp/pub/OpenBSD/OpenSSH/portable/
- https://github.com/openssh/openssh-portable
ダウンロードしたファイルを解凍する。
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ライブラリが必要な場合は、ソースコードからインストールする。
- LDNSのビルドに必要なライブラリをインストールする。
sudo zypper install make libtool libpcap-devel python-devel python3-devel python3-ldns
- LDNSの公式WebサイトまたはGithubにアクセスして、ソースコードをダウンロードする。
- ダウンロードしたファイルを解凍する。
tar xf ldns-<バージョン>.tar.gz
cd ldns-<バージョン>
- 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時間)その他、 s 、S 、m 、M 、h 、H 、d 、D 、w 、W が使用できる。また、これらを組み合わせて使用することもできる。( 1h30m 等)デフォルトは、第1項目は0、第2項目は0 |
SSHは、通信を暗号化するためにホストとクライアント間でセッション鍵を交換している。 暗号化を堅牢に行うために都度鍵を変更している。 第1項目に default を指定する場合、1[GB]から4[GB]の間の適切なタイミングで再生成を行う。第2項目の 0 はnone と等価である。
|
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時間)その他、 s 、S 、m 、M 、h 、H 、d 、D 、w 、W が使用できる。また、これらを組み合わせて使用することもできる。( 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引数 |
ユーザがログインした時にサーバ上で起動される外部プログラムを指定する。 サブシステムは、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/configファイルに
- サーバ管理者に連絡する
- サーバ側の設定や負荷状況を確認してもらう。
- ファイアウォールやセキュリティソフトの設定を確認する
- SSHトラフィックが阻害されていないか確認する。
このエラーの正確な原因を特定するには、より詳細な情報 (サーバのOS、SSHクライアントのバージョン、ネットワーク環境等) が必要となる。