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

推薦する

uniappがインターフェースドメイン名を動的に取得する方法を分析する

背景インターフェイス ドメイン名はハードコードされておらず、動的に取得されます。具体的な実装は、静的...

Linux 上でプライベート Git サーバーを構築するための詳細なチュートリアル

1. サーバーのセットアップリモート リポジトリは実際にはローカル リポジトリと何ら変わりなく、純粋...

MySQL における := と = の違いをグラフィカルに紹介

:= と = の違い=設定および更新の場合にのみ、:= と同じ効果、つまり代入効果があり、それ以外の...

Vue.js の watch メソッドと computed メソッドの違いの詳細な例

目次序文導入1. 作用機序2. 自然から3. 時計と計算の比較4. メソッドはデータロジックの関係を...

Vue のプラグインとコンポーネントの違いと使い方のまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...

ワンクリックで雨や雪のエフェクトを実現する ThingJS パーティクルエフェクト

目次1. パーティクルエフェクト2. シーンを読み込む3. さまざまな粒子効果の実現エンディング: ...

MySQL方言の簡単な紹介

データベースはさておき、人生における方言とは何でしょうか?方言とは、ある場所特有の言語です。他の場所...

nginx を使用して正規表現で指定された URL リクエストを傍受する方法

nginx サーバーnginx は、静的ファイルの処理に非常に効率的な優れた Web サーバーです。...

Linux CentOS 6.5 のアンインストール、tar、および MySQL のインストールチュートリアル

システム提供のMySQLをアンインストールする1. MySQLがシステムにインストールされているかど...

Linux での MySQL 8.0.25 のインストールと設定のチュートリアル

LinuxにMySQL 8.0.25をインストールするための最新のチュートリアルを参考にしてください...

Centos7 システムでの MySQL マスター スレーブ同期構成スキーム

序文最近、高可用性プロジェクトに取り組む際には、データの同期が必要になっています。ノードが 2 つし...

mysql8.x docker リモートアクセスの詳細な設定

目次環境条件エラーが発生しました回避策1. mysql dockerにログインする2. ルートパスワ...

組み込み移植 docker エラー問題 (概要)

長い移植と情報検索の期間を経て、組み込みDockerの問題を解決することができました。インターネット...

Tomcat をサービスとして登録する際に注意すべき点のまとめ

Tomcat をサービスとして登録する場合の注意点は次のとおりです。 インターフェースを開いたら、以...

MySQL トリガーの紹介、トリガーの作成、使用制限の分析

この記事では、例を使用して、MySQL トリガーの概要、トリガーの作成方法、およびトリガーの使用上の...