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を入力してください。

推薦する

HTML における src と href の違いについての簡単な説明

簡単に言うと、srcは「このリソースをロードしたい」という意味で、hrefは「このリソースに関連付け...

WindowsでのNginxの起動や停止などの基本操作コマンドの詳しい説明

Windows で Nginx を使用するには、Nginx サービスの起動、停止、Nginx のリロ...

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

Dockerコンテナの紹介

1. 概要1.1 基本概念: Docker は、Go 言語をベースにしたオープンソースのアプリケーシ...

コードを通じてHTMLエスケープ文字を識別する方法について説明します

データ内に次のような特徴を持つ「 ' 」などの文字が含まれることがあります。 &# ...

ネイティブ JavaScript でショッピングカートを実装する

この記事では、ショッピングカートを実装するためのJavaScriptの具体的なコードを参考までに紹介...

MySQLのインストールと設定に関する詳細なチュートリアル

目次インストール不要のMySQLバージョン1. インストール パッケージをダウンロードします。 2....

tomcat ログ ディレクトリ内のログ ファイルの分析 (概要)

tomcat が起動されるたびに、次のログ ファイルがログ ディレクトリに自動的に生成され、日付順...

MySQL 5.7 をバイナリモードでインストールし、Linux でシステムを最適化する手順

この記事では主に、MySQL バイナリ パッケージのインストール/起動/シャットダウンのプロセスを紹...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...

MySQL のファントムリード問題を解決する方法

目次序文1. ファントムリーディングとは何ですか? 2. ファントムリーディングの問題点は何ですか?...

MySQL 5.7 JSON 型の使用の詳細

JSON は、言語に依存しないテキスト形式を使用する軽量のデータ交換形式で、XML に似ていますが、...

Linux で ffmpeg をインストールするための詳細なチュートリアル

1. CentOS Linuxにffmpegをインストールする1.ダウンロードして解凍する http...

JS で async await をエレガントに使用する方法

目次jQuery の $.ajax Webpack時代の始まり約束について深く考えるネストをなくすj...

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...