非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する

非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する

アプリケーションをコンテナ化した後、Docker コンテナを起動すると、デフォルトで root ユーザーを使用してコマンドが実行されます。そのため、コンテナ内のアプリケーションはデフォルトで root ユーザーによって実行されるため、セキュリティ上のリスクが高くなります。では、非 root ビジネス ユーザーを使用してアプリケーションを実行するにはどうすればよいでしょうか。

これを説明するために簡単な例を挙げてみましょう。

この例では、コンテナ内で自分で作成したユーザーを使用して単純なシェル スクリプトを実行し、スクリプトの出力ログをコンテナの外部に保持します。次に、イメージ作成からコンテナ操作までの全体の流れを見てみましょう。

1. イメージをビルドします。

イメージをビルドするには、dockerfile を使用します。ベース イメージは ubuntu 14.04 です (最初にイメージをプルする必要があります、docker pullubuntu:14.04)。 dockerfileの内容は次のとおりです

[root@host09 テスト]# cat Dockerfile
docker.io/ubuntu:14.04 より 
メンテナー He Pengfei

RUN groupadd hpf -- ユーザー グループを作成します。RUN useradd -d /data -g hpf -mhpf -- ユーザーを作成します。RUN su - hpf -c "mkdir -p /data/scripts" 
su - hpf -c "mkdir -p /data/logs" を実行します。
WORKDIR /data/scripts
test.sh /data/scripts/ をコピーします
chown hpf:hpf test.shを実行します。
chmod 755 test.shを実行します。

ENTRYPOINT su - hpf -c "/data/scripts/test.sh" -- 作成したユーザーを使用してスクリプト [root@host09 test] を実行します。#

スクリプトの内容は次のとおりです。

[root@host09 テスト]# cattest.sh
一方、[ 1 = 1 ]
する
echo `id`>>/data/logs/hpf.log -- ログをファイルに出力し、コンテナの起動時に永続化します sleep 1
終わり
[root@host09 テスト]#

次に、イメージをビルドしましょう。

[root@host09 test]# dockerbuild -t hpf:v2 .
ビルド コンテキストを Docker デーモンに送信しています 3.072 kB
ステップ1: docker.io/ubuntu:14.04から
 ---> c69811d4e993
ステップ2: MAINTAINER hepengfei
 ---> キャッシュの使用
 ---> b8401d2eb439
ステップ3: groupadd hpfを実行する
 ---> キャッシュの使用
 ---> 2e0d20802c41
ステップ4: useradd -d /data -g hpf -m hpfを実行します
 ---> キャッシュの使用
 ---> バク36ee97aba
ステップ 5: su - hpf -c "mkdir -p /data/scripts" を実行します。
 ---> キャッシュの使用
 ---> a92c3f5f8e34
ステップ 6: su - hpf -c "mkdir -p /data/logs" を実行します。
 ---> キャッシュの使用
 ---> 2e8665da7092
ステップ7: WORKDIR /data/scripts
 ---> キャッシュの使用
 ---> 7cf84a5a8aca
ステップ8: test.sh /data/scripts/ をコピーする
 ---> 7e4c24de2096
中間コンテナ f96358d91c35 を削除しています
ステップ9: chown hpf:hpf test.shを実行します。
 ---> fc9ab290c56c で実行中
 ---> f38afd1ea62c
中間コンテナ fc9ab290c56c を削除しています
ステップ10: chmod 755 test.shを実行する
 ---> a35b507a1527 で実行中
 ---> 5b5223249f4c
中間コンテナ a35b507a1527 を削除
ステップ 11: ENTRYPOINT su - hpf -c "/data/scripts/test.sh"
 ---> 1ee7cc7fbec7 で実行中
 ---> 26e7d603dbac
中間コンテナの削除 1ee7cc7fbec7
26e7d603dbac の構築に成功しました
[root@host09 テスト]#

ビルドされたイメージを表示します。

[root@host09 test]# docker イメージ
リポジトリ タグ イメージID 作成サイズ
hpf v2 26e7d603dbac 42 分前 188.3 MB
docker.io/ubuntu 14.04 c69811d4e993 3 週間前 188 MB
[root@host09 テスト]#

2. コンテナを起動します。

コンテナを起動する前に、ホスト上の /data/hepf/log ディレクトリの権限を変更する必要があることに注意してください。そうしないと、コンテナが起動したときに、スクリプト内のログにディレクトリへの書き込み権限が与えられません。ディレクトリの権限を直接 777 に変更しました。

[root@host09 テスト]#chmod 777/data/hepf/log

[root@host09 テスト]# docker run -it -v/data/hepf/log:/data/logs hpf:v2

次に、/data/hepf/log ディレクトリ内のログ ファイルを表示してみましょう。

[root@host09 ログ]# pwd
/データ/hepf/ログ
[root@host09 ログ]# ll
合計 12
-rw-rw-r-- 1 1000 1000 108009月7日 08:02 hpf.log
[root@host09 ログ]# tail -2 hpf.log
uid=1000(hpf) gid=1000(hpf) グループ=1000(hpf)
uid=1000(hpf) gid=1000(hpf) グループ=1000(hpf)
[root@host09 ログ]#

ファイルの所有者は、コンテナ内に作成された hpf ユーザーと同じであることがわかります。

hpf@ba688af3f598:~$ id
uid=1000(hpf) gid=1000(hpf) グループ=1000(hpf)
hpf@ba688af3f598:~$

コンテナ内に作成したユーザーと同じ ID を持つ別のユーザーがホスト上にいる場合、ホスト上のログ ファイルの所有者はそのユーザーになりますが、今のところ問題は見つかっていません。

[root@host09 ログ]# cat /etc/passwd |grep hpf1
hpf1:x:1000:1000::/data1:/bin/bash[root@host09 ログ]# ll
合計 12
-rw-rw-r-- 1 hpf1 hpf1 11250 9月7日 08:50hpf.log
[root@host09 ログ]#

これで簡単な例は終わりです。

追加知識: Docker のデフォルト ストレージと Docker の非ルート ユーザー

方法1

sudo docker info | grep “Docker ルートディレクトリ”

まず、Docker サービスを停止します。

systemctl dockerを再起動します

または

サービス docker 停止

次に、/var/lib/docker ディレクトリ全体を宛先パスに移動します。

mv /var/lib/docker /root/data/docker

ルートディレクトリの /var/lib/docker にデータを書き込む

方法2

Docker 構成ファイルでは、バックグラウンド プロセスのほとんどのパラメータを設定できます。保存場所はオペレーティング システムによって異なります。Ubuntu の場所は /etc/default/docker、CentOS の場所は /etc/sysconfig/docker です。

CentOS の場合は、次の行を追加します。

オプション=–graph=”/root/data/docker” –selinux-enabled -H fd://

Ubuntu の場合は、次の行を追加します (Ubuntu ではデフォルトで selinux が有効になっていないため)。

オプション=–graph=”/root/data/docker” -H fd://

または

DOCKER_OPTS="-g /root/data/docker"

1. まず、docker ユーザー グループを作成します。docker ユーザー グループが存在する場合は無視できます。

sudo グループ追加 docker

2. ユーザーをdockerグループに追加する

sudo gpasswd -a ${USER} docker

3. Dockerを再起動する

sudo サービス docker を再起動

4. 通常のユーザーがdockerコマンドを実行し、「get ... dial unix /var/run/docker.sock」というプロンプトが表示され、権限が不十分な場合は、/var/run/docker.sockの権限を変更します。

root ユーザーを使用して、次のコマンドを実行します。

sudo chmod a+rw /var/run/docker.sock

非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する方法に関する上記の記事は、エディターが皆さんと共有するコンテンツのすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerでmysqlのルートパスワードを変更する方法
  • Docker を使用してコンテナ内のルート パスワードを変更する方法
  • Dockerコンテナでルート権限を取得する方法
  • Dockerはコンテナに入るためにルートを使用する
  • ルート権限なしでログインするためのDockerソリューション

<<:  MySQLのCOUNT(*)のパフォーマンスについてお話しましょう

>>:  JavaScript の BigIn 関数の共通プロパティをまとめます

推薦する

CSSの絶対と相対について

冒頭にこう書かれています:アブソリュートは言った。「親戚よ、私はあなたを私の人生で見たくない!」なぜ...

Vue のトランジション効果とアニメーショントランジションの使用例の詳細な説明

目次遷移フック関数カスタム遷移クラス名遷移グループの使用まとめまずは例を見てみましょうコードは次のと...

Vueデータ監視の原理の詳細な説明

<本文> <div id="ルート"> <h1&...

MySQL 5.7 の Docker バージョンを MySQL 8.0.13 にアップグレードし、データを移行する

目次1. 古いMySQL5.7データをバックアップする2. MySQL8.0.13のイメージをプルし...

CSSは左固定と右適応のレイアウト方法を実現します

1. フローティングレイアウト1. 最初に固定幅の div をフロートさせます。ドキュメントフローか...

Linux サーバーは最大いくつのポートを開くことができますか?

目次ポート関連の概念:ポートとサービスの関係1: nmapツールが開いているポートを検出する2: n...

js、css、htmlはブラウザのさまざまなバージョンを決定します

正規表現を使用してIEブラウザのバージョンを判別するIEブラウザかどうか確認するif (docume...

MySQLの暗黙的な変換問題の解決

1. 問題の説明 root@mysqldb 22:12: [xucl]> テーブル t1\G ...

間違った MySQL コマンドをキャンセルしたい場合はどうすればいいですか?

間違った mysql コマンドを入力したのでキャンセルしたいです。どうすればいいですか? ctrl ...

MySQL インデックスの知識の要約

MySQL インデックスの確立は、MySQL の効率的な操作にとって非常に重要です。インデックスによ...

デザイナーと開発者に役立つ 9 つの超実用的な CSS のヒント

Web デザイナーの頭の中には、仕事に関連する多くの知識が詰まっている必要があります。 CSS は、...

Centos6にMysql5.7をインストールする方法

環境セントロス6.6 MySQL 5.7インストールシステムがインストールされている場合は、まずアン...

JS ES6コーディング標準の詳細な説明

目次1. ブロックスコープ1.1. let は var を置き換える1.2. グローバル定数とスレッ...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

タブ切り替え機能を実装するJavaScriptカスタムプラグイン

この記事では、タブ切り替え機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...