dockerでsshd操作を有効にする

dockerでsshd操作を有効にする

まず、docker に openssh-server をインストールします。インストールが完了したら、openssh-server のインストール ディレクトリ /etc/ssh に切り替えます。

ssh-keygen を実行して対応するキーを生成します。

まず、次の内容を含む sshd 構成ファイル sshd_config を確認します。

ホストキー /etc/ssh/ssh_host_rsa_key
#ホストキー /etc/ssh/ssh_host_dsa_key
ホストキー /etc/ssh/ssh_host_ecdsa_key
ホストキー /etc/ssh/ssh_host_ed25519_key

暗号化方式には、rsa、dsa、ecdsa、ed25519 などがあります。これらの暗号化方式に応じて、対応するキー ペアが生成されます。

[root@655f62a4ed82 ssh]# ssh-keygen -t rsa //rsaを生成
公開/秘密 RSA キー ペアを生成しています。
キーを保存するファイル (/root/.ssh/id_rsa) を入力します。 
パスフレーズを入力してください (パスフレーズがない場合は空白): 
同じパスフレーズをもう一度入力してください: 
あなたの識別情報は /root/.ssh/id_rsa に保存されました。
公開鍵は /root/.ssh/id_rsa.pub に保存されました。
キーのフィンガープリントは次のとおりです。
0e:fa:07:36:bb:87:c1:60:14:be:41:41:01:1b:4b:bc ルート@655f62a4ed82
キーのランダムアート画像は次のとおりです。
+--[RSA 2048]----+
| .+o*+ |
| ..*. |
|おおおお|
| えーーーー |
| ..o. S |
| .*o |
| .. *. |
| .oo |
| o+ |
+-----------------+
[root@655f62a4ed82 ssh]# ssh-keygen -t dsa //dsaを生成
公開/秘密 DSA キー ペアを生成しています。
キーを保存するファイル (/root/.ssh/id_dsa) を入力します。 
パスフレーズを入力してください (パスフレーズがない場合は空白): 
同じパスフレーズをもう一度入力してください: 
あなたの識別情報は /root/.ssh/id_dsa に保存されました。
公開鍵は /root/.ssh/id_dsa.pub に保存されました。
キーのフィンガープリントは次のとおりです。
ee:8c:db:a8:24:68:0d:33:79:eb:09:33:ed:74:c3:66 ルート@655f62a4ed82
キーのランダムアート画像は次のとおりです。
+--[DSA 1024]----+
| |
| |
| |
| . |
| = . S |
| .B o . |
|.=.=.E . |
|.Bo= .* |
| +..+.+ |
+-----------------+
[root@655f62a4ed82 ssh]# ssh-keygen -t ecdsa //ecdsaを生成
公開/秘密 ecdsa キー ペアを生成しています。
キーを保存するファイル (/root/.ssh/id_ecdsa) を入力します。 
パスフレーズを入力してください (パスフレーズがない場合は空白): 
同じパスフレーズをもう一度入力してください: 
あなたの識別情報は /root/.ssh/id_ecdsa に保存されました。
公開鍵は /root/.ssh/id_ecdsa.pub に保存されました。
キーのフィンガープリントは次のとおりです。
84:74:de:d1:e4:98:a1:5c:27:25:8e:b7:d6:27:fd:c9 ルート@655f62a4ed82
キーのランダムアート画像は次のとおりです。
+--[ECDSA 256]---+
| . . *++ |
| . = * X. |
| . * * . |
| . . o . |
|S ooo |
| . お...|
| E.|
| |
| |
+-----------------+
[root@655f62a4ed82 ssh]# ssh-keygen -t ed25519
公開/秘密 ed25519 キー ペアを生成しています。
キーを保存するファイル (/root/.ssh/id_ed25519) を入力します。 
パスフレーズを入力してください (パスフレーズがない場合は空白): 
同じパスフレーズをもう一度入力してください: 
あなたの識別情報は /root/.ssh/id_ed25519 に保存されました。
公開鍵は /root/.ssh/id_ed25519.pub に保存されました。
キーのフィンガープリントは次のとおりです。
d8:40:95:1f:07:96:8a:83:7f:af:19:01:3b:b4:79:91 ルート@655f62a4ed82
キーのランダムアート画像は次のとおりです。
+--[ED25519 256--+
| ....うーん |
| . .oo . |
| .+.Eo o |
| ..oO... |
| .*.S |
| .o.. |
... |
| o. |
| o. |
+-----------------+
[root@655f62a4ed82 ssh]# cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

キー ペアが生成されたら、sshd_config 内の上記ファイルの場所を変更する必要があります。

ホストキー /root/.ssh/id_rsa
ホストキー /root/.ssh/id_dsa
ホストキー /root/.ssh/id_ecdsa
ホストキー /root/.ssh/id_ed25519

/usr/sbin/sshd を実行して、ポート 22 が有効になっているかどうかを確認します。有効になっている場合は、起動が成功したことを示します。

[root@655f62a4ed82 ssh]# /usr/sbin/sshd
[root@655f62a4ed82 ssh]# lsof -i:22
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
sshd 37 ルート 3u IPv4 250907 0t0 TCP *:ssh (LISTEN)
sshd 37 ルート 4u IPv6 250909 0t0 TCP *:ssh (LISTEN)

追加情報: Docker コンテナで sshd プロセスを実行すると、リモート ログインがクラッシュします (終了ステータス 254)

注記:

背景

コンテナ内で sshd プロセスが実行され、外部リモート接続用のポートがマッピングされます。接続するたびにパスワード入力後すぐにログアウトされてしまいます。現象は以下のようになります。

[root@localhost /]# ssh [email protected] -p 8000
[email protected]のパスワード: 
最終ログイン: 2018年11月6日火曜日 14:46:17 192.168.0.6から
192.168.0.6 への接続が閉じられました。

デバッグ情報を確認すると、最終的な終了時の出力は次のようになります。

......
192.168.0.6 への接続が閉じられました。
転送: 送信 2264、受信 2224 バイト、0.0 秒
1秒あたりのバイト数: 送信 235367.6、受信 231209.1
debug1: 終了ステータス 254

分析する

プリントアウトには前回のログイン情報がすでに記載されており、パスワードは正しく入力されており、システムにログインできたはずですが、環境の初期化中に失敗しました。まず、hosts.deny の設定を検討しました。関連する設定をコメントした後も、問題は依然として存在します。

インターネット上では、sshd 設定ファイル内の UsePAM 設定をコメントアウトすると、pam 認証モジュールを使用しないことを意味すると言われています。

#PAMを使用する

sshd プロセスを変更して再起動すると、期待どおりに動作します。理由としては、いずれもデフォルト設定でタイムアウト切断機能が有効になっているためとのことでした。これはナンセンスです。デフォルトのリンク切断時間がそれほど短くなるはずはなく、非 Docker 環境で sshd プロセスが正常に実行される理由です。私はこの理由を受け入れません。それではもう一度見てみましょう。 pam 認証を使用しない場合は問題ないので、/etc/pam.d/ 内の sshd 関連の設定を一つずつコメントアウトしてみましたが、それでも問題は見つかりませんでした。

この時点で、pam ログを確認すると、何らかの手がかりが得られるはずだと考えました。ちなみに、RedHat と CentOS は pam ログを /var/log/secure に保存し、Ubuntu と Debian は認証情報を /var/log/auth.log に保存します。

案の定、pam にエラー メッセージが表示されます。

11月6日 15:36:56 bbb sshd[11016]: 192.168.0.6 ポート56394 ssh2 から root のパスワードを受け入れました
11月6日 15:36:56 bbb sshd[11016]: pam_limits(sshd:session): 'nproc' の制限を設定できませんでした: 操作は許可されていません
11月6日 15:36:56 bbb sshd[11016]: pam_limits(sshd:session): 'nofile' の制限を設定できませんでした: 操作は許可されていません
11月6日 15:36:56 bbb sshd[11016]: pam_limits(sshd:session): 'memlock' の制限を設定できませんでした: 操作は許可されていません
11月6日 15:36:56 bbb sshd[11016]: pam_unix(sshd:session): (uid=0) によってユーザー root のセッションが開かれました
11月6日 15:36:56 bbb sshd[11016]: エラー: PAM: pam_open_session(): 権限が拒否されました
11月6日 15:36:56 bbb sshd[11016]: 192.168.0.6から切断を受信しました: 11: ユーザーによって切断されました

これは、nproc、nofile、memlock などのパラメータを設定する権限が不十分なために発生していることがわかります。これらの構成は pam コンポーネントにあり、次の 2 つのファイルに保存されています。

制限

/etc/security/limits.d/90-nproc.conf

これら 2 つのファイル内の関連する設定をコメント アウトし、PAM 認証をオンにすると、SSH 接続が成功します。それが問題なのです。

他の方法もあります

1. 権限不足が原因であるため、コンテナの起動時に--privilegedパラメータを指定して、権限のあるユーザーを使用して問題を解決します。

2. ulimitsの設定にエラーがあるため、コンテナの起動時に--ulimit=[]パラメータを使用して設定することができます。

docker で sshd 操作を有効にする方法については、上記の記事が皆さんに共有できるすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • docker実行時に異なるポートを占有する2つのポートを起動する問題を解決する
  • Linux の Docker コンテナで bash を終了する 2 つの方法
  • Dockerはプロセス操作を管理するためにSupervisorを使用する

<<:  WeChatアプレット開発の共通機能と使用方法のまとめ

>>:  MySQLクエリデータを時間別に表示します。データがない場合は0を入力してください。

推薦する

Linux カーネル デバイス ドライバー 高度な文字デバイス ドライバーのメモ

/****************** * 高度な文字デバイス ドライバー ***********...

MySql データベース クエリの特殊コマンド

まずMySQLのインストールMySQLソフトウェアをダウンロードし、インストールパスを変更しますMy...

docker pull imageエラーの問題を解決する

説明する: Windows 10 に VM をインストールし、VM で Docker を実行し、Do...

MySQL の最適化: 高品質の SQL 文を書く方法

序文インターネット上にはデータベースの最適化に関する情報や方法が数多くありますが、その多くは品質にば...

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

MySQLの整数および文字列インデックスの無効化または暗黙的な変換に関する簡単な説明

目次問題の概要問題の再現問題の拡大結論は問題の概要今日、仕事中に、DBA が突然、SQL に暗黙的な...

Nginx は rtmp ライブ サーバーの実装コードを構築します

1. nginxソースディレクトリに新しいrtmpディレクトリを作成し、git clone http...

フロントエンドの HTML 知識ポイントのまとめ (推奨)

1. HTMLの概要htyper テキスト マークアップ言語 ハイパーテキスト マークアップ言語ハ...

TypeScript における列挙型の理解と応用シナリオ

目次1. 何ですか2. 使用数値列挙文字列列挙異種列挙自然3. 応用シナリオ要約する1. 何ですか列...

MySQLの自動増分主キーの実装の詳細な説明

目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...

Vueにログイン認証傍受機能を設置するアイデアを詳しく解説

目次1. 解決策2. サーバーから返されたトークンをブラウザに保存する3. リクエストにアクセス権限...

mysql5.7.24 バージョンのインストール手順と解凍時に発生した問題の概要

1. ダウンロード参考: 2. D:\MySQL\mysql-5.7.24 などの固定の場所に解凍し...

Linux と最もよく使用されるコマンドの紹介 (習得は簡単ですが、問題の 95% 以上を解決できます)

Linux は現在最も広く使用されているサーバー オペレーティング システムです。Unix をベー...

HTML に画像が存在しない場合にデフォルトの画像を表示する方法の例

画像リンク <img src="" /> jsを使用してURLが有効...

要素テーブルからヘッダーを削除する方法

show-header属性を使用したドキュメントのヒントshow-header <el-テーブ...