設定 - SSH

提供:MochiuWiki : SUSE, EC, PCB
2023年2月2日 (木) 22:51時点におけるWiki (トーク | 投稿記録)による版 (→‎OpenSSHの設定項目)
ナビゲーションに移動 検索に移動

概要

SSHサーバを構成し、リモート端末からサーバに接続して操作できるようにする。
SSHサーバは、CentOSをMinimal Installした場合やopenSUSEを最小インストールした場合でも、標準で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
LOCAL1
LOCAL2
LOCAL3
LOCAL4
LOCAL5
LOCAL6
LOCAL7

デフォルトは、AUTH
sshdがsyslogサーバに出力するログメッセージのファシリティ(分類)を指定する。
LogLevel QUITE
FATAL
ERROR
INFO
VERBOSE
DEBUG
DEBUG1
DEBUG2
DEBUG3

デフォルトは、INFO
sshdが出力するログのログレベルを指定する。
LoginGraceTime 時間(週、日、時、分、秒)
分で使用する場合は、5m等と記述する。(この場合は、5分)
時で使用する場合は、1h等と記述する。(この場合は、1時間)

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

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

デフォルトは、yes
rootでのログインを許可するかどうかを指定する。
without-passwordは、パスワードを使用したrootユーザのログインを拒否する。
forced-commands-onlyは、rootユーザの直接ログインを拒否するが、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項目で指定したコマンドを実行する時のユーザを指定する。
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の場合は認証に失敗する。
KerberosAuthentication yes
no
デフォルトは、no
ケルベロス認証を許可する。
KerberosOrLocalPasswd yes
no
デフォルトは、yes
ケルベロス認証で失敗した場合は、ローカルパスワードで認証する。
KerberosTicketCleanup yes
no
デフォルトは、yes
ログアウト時、ケルベロス認証用のキャッシュを自動的に削除する。
KerberosGetAFSToken yes
no
デフォルトは、no
ケルベロス認証において、AFSが有効であり、ユーザがKerberos 5のTGTを持っている場合、
ユーザのホームディレクトリにアクセスする前に、AFSトークンの取得を試みる。

現在のOpenSSHでは、廃止された。
KerberosUseKuserok yes
no
デフォルトは、yes
ケルベロス認証で、.k5loginファイルが存在する場合は使用する。

現在のOpenSSHでは、廃止された。
GSSAPIAuthentication yes
no
デフォルトは、no
GSSAPIベースのユーザ認証を使用する。
SSH2の場合のみ適用される。
GSSAPICleanupCredentials yes
no
デフォルトは、yes
ユーザがログアウトする時、その証明書キャッシュを自動的に消去する。
SSH2の場合のみ適用される。
GSSAPIStrictAcceptorCheck yes
no
デフォルトは、yes
GSSAPIアクセプタのチェックを厳格に行う。
GSSAPIKeyExchange yes
no
デフォルトは、no
GSSAPIを許可するために鍵交換を行う。
GSSAPIStoreCredentialSonreKey yes
no
デフォルトは、no
調査中
GSSAPIKexAlgorithms デフォルトは、gss-gex-sha1-,gss-group14-sha1- 調査中
UsePAM yes
no
デフォルトは、no
PAM(Pluggable Authentication Module)インターフェースによる認証を許可する。
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のみ許可する。
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 yes
no
デフォルトは、0
クライアントの生存チェック間隔を指定する。
デフォルトは、チェックしない。(0)
ClientAliveCountMax yes
no
デフォルトは、3
クライアントの生存チェック最大カウント数を指定する。
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
セッション確立時に表示する文字列を指定する。
Subsystem 外部サブシステムを指定する。
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のパスワード認証

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アドレス>