非ルートユーザーを使用して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 関数の共通プロパティをまとめます

推薦する

SEATAトランザクションサービスDockerのデプロイ手順の詳細説明

1. データベース認証ステートメントを作成する > データベース seata を作成します。 ...

React+Ant Design開発環境をセットアップするための実装手順

基礎1. スキャフォールディングを使用してプロジェクトを作成し、開始する1.1 足場を設置する: n...

MYSQL の binlog 最適化に関する考察の要約

質問質問 1: トランザクションをコミットするときに REDO ログをフラッシュすることによって発生...

div が iframe に覆われるいくつかの状況とその解決策

類似の構造:コードをコピーコードは次のとおりです。 <div></div>&...

CSSカウンター関連属性の学習の詳細な説明

CSS カウンター属性はほぼすべてのブラウザ (IE8 を含む) でサポートされていますが、あまり使...

vue_drf は SMS 認証コードを実装します

目次1. 需要1. 需要2. SDKパラメータ設定1. ディレクトリ構造3. コードの実装1. バッ...

Reactフックの長所と短所

目次序文アドバンテージ:欠点: 1. レスポンシブな使用効果2. ステータスが同期されていないRea...

CentOS 8にJenkinsをインストールする方法

CentOS 8 に Jenkins をインストールするには、root アカウントまたは sudo ...

MySQLクエリトランザクション処理へのノード接続の実装

目次トピックmysqlの追加、削除、変更、クエリを入力しますMySQL トランザクション処理私は M...

background-positionプロパティでのパーセンテージ値の使用法の検討

背景位置が背景画像の表示に与える影響この2日間のプロジェクトでホームページの写真を入れ替えていたとこ...

nginx を使用して静的リソース サーバーを構築する方法

Windows を例にとると、Linux も実際には同じです。静的リソースサーバーを構築するパソコン...

Linux での Centos7 ファイアウォールの基本的な使用方法の詳細な説明

1. ファイアウォールの基本的な使い方起動する: systemctl は、firewalld を起動...

コネクタコンポーネントから Tomcat のスレッドモデルを見る - BIO モード (推奨)

Tomcat の上位バージョンでは、デフォルト モードは NIO モードを使用することになります。...

Vue 仮想 Dom から実際の Dom への変換

別のツリー構造があるJavascriptオブジェクトでは、このツリーが本物であると伝えるだけでよいD...

CSS 画像アニメーション効果のサンプルコード(フォトフレーム)

この記事では、CSS 画像アニメーション効果(フォトフレーム)のサンプルコードを紹介し、皆さんと共有...