GNU/Linux >> Linux の 問題 >  >> Linux

SELinuxでコンテナを保護する

Linux環境で問題が発生した場合、最も簡単な方法はSecurity-Enhanced Linux(SELinux)を無効にすることです。物事が突然機能し始め、あなたはそれを忘れますが、これは非常に強力なセキュリティツールを失ったことを意味する一般的な落とし穴です。

コンテナ、マイクロサービス、分散アーキテクチャの台頭とともに、脅威が高まっています。これは、古くてよく知られている問題である速度が原因です。コンテナの利点は、すばやく移動し、より多くのことを実行し、すばやく変更できることです。これは、コンテナの採用が屋根から外れたことを意味しますが、それがもたらす速度は、より多くの問題や脆弱性に遭遇することも意味します。これは、より多くのことをより速く、より速く行うときに自然に起こります。

脅威を軽減する方法

Linuxコンテナ

  • Linuxコンテナとは何ですか?
  • コンテナ用語の概要
  • ダウンロード:Containers Primer
  • Kubernetesオペレーター:コンテナオーケストレーションプラットフォームの自動化
  • eBook:クラウドネイティブアプリを設計するためのKubernetesパターン
  • Kubernetesとは何ですか?

孫子が言ったように、「賢い戦士は戦いを避けます」。この引用は、コンテナの基本的な防御に関しては本当に共鳴します。問題(戦闘)を回避するには、コンテナーホストが安全であり、SELinuxを最初の防衛線として使用できることを確認してください。

SELinuxは、2000年にリリースされ、2003年にLinuxカーネルに統合されたオープンソースプロジェクトです。RedHatの説明者によると、「SELinuxは、管理者がシステムにアクセスできるユーザーをより細かく制御できるLinuxシステムのセキュリティアーキテクチャです。元々はLinux Security Modules(LSM)を使用したLinuxカーネルへの一連のパッチとして米国国家安全保障局(NSA)によって開発されました。 "

はじめに

コンテナについて考えるとき、おそらく最初に頭に浮かぶのはDockerです。 Dockerは、2013年に登場してからコンテナ採用革命を開始しました。これが、コンテナの人気が爆発的に高まった主な理由の1つですが、前述のように、採用のレベルが高いと、セキュリティリスクに対するユーザーの脆弱性が高まりました。

DockerコンテナーをSELinuxで保護する前に、いくつかの設定を行う必要があります。

前提条件:

  • CentOS 8 /RHEL8がインストールおよび構成されている
  • DockerCEのインストールと構成
  • 作成された2つのアカウント:ルートと非ルート(mcalizo 以下の例で)

RHEL 8 / CentOS 8サーバーでDockerをセットアップする必要がある場合は、次の手順に従うことができます。 RHEL 8を実行している場合は、開始する前に、プレインストールされているPodmanおよびruncパッケージを削除する必要があります。

まず、SELinuxが有効になっていることを確認します:

[mcalizo@Rhel82 ~]$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31
[mcalizo@Rhel82 ~]$

次に、OSのバージョンと、Dockerが実行されていることを確認します。ルートとしてログインして実行します:

[root@rhel82 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.2 (Ootpa)
[root@rhel82 ~]#

[root@rhel82 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago
     Docs: https://docs.docker.com
 Main PID: 30768 (dockerd)
    Tasks: 8
   Memory: 39.0M
   CGroup: /system.slice/docker.service
           └─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg=">
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903413613-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903427451-04:00" level=warning msg>
Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.903538271-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.132060506-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.308943088-04:00" level=info msg="L>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319438549-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.319570298-04:00" level=info msg="D>
Oct 28 19:10:14 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:14.333419209-04:00" level=info msg="A>
Oct 28 19:10:14 rhel82.home.labs.com systemd[1]: Started Docker Application Container Engine

Dockerのバージョンを確認してください:

[root@rhel82 ~]# docker --version
Docker version 19.03.13, build 4484c46d9d
ホストをハックする

問題を理解するための最良の方法の1つは、それを体験することです。そこで、セキュリティが適切に設定されていない場合に、悪意のあるコードをDockerホストに挿入するのがいかに簡単かを説明します。

Dockerホストで何か悪いことをするために、悪意のある非rootユーザー(mcalizo このチュートリアルでは)Dockerコンテナをインスタンス化できるグループの一部である必要があります。

まず、mcalizoのグループを確認します ユーザーが属する:

[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo

出力は、mcalizoであることを示しています 自分のグループにのみ属します。これは、mcalizoを意味します Dockerコンテナーをインスタンス化できず、試行するとこのエラーが発生します:

[mcalizo@Rhel82 ~]$ docker run -it --rm centos:latest /bin/sh
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

mcalizoを許可するには コンテナをインスタンス化するには、ユーザーをdockerに追加します グループ:

[root@Rhel82 ~]# usermod -G docker -a mcalizo
[root@Rhel82 ~]# groups mcalizo
mcalizo : mcalizo docker

次に、fedora:latestをデプロイします コンテナを作成し、インスタンス化されたコンテナにログインして探索します:

[mcalizo@Rhel82 ~]$ docker run -it --rm fedora:latest /bin/sh
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
ee7e89337106: Pull complete
Digest: sha256:b9ec86d36fca7b1d3de39cd7c258e8d90c377d312c21a7748071ce49069b8db4
Status: Downloaded newer image for fedora:latest
sh-5.0# cat /etc/redhat-release
Fedora release 33 (Thirty Three)

新しく作成されたコンテナにログインしている間、rootとして自動的にログインしていることがわかります:

sh-5.0# whoami
root
sh-5.0#

rootとして ユーザー、あなたはこのコンテナで何でもすることができます、それはあなたがコンテナホストを悪用して多くの損害を与えることができることを意味します。コンテナをインスタンス化できるため、ホストのsudoersアカウントに属していない場合でも、ホストに対して何かを行うことができます。

作成したばかりのコンテナを終了し、エクスプロイトを示すために新しいコンテナを作成します。

[mcalizo@Rhel82 ~]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@131043f2e306 /]#

-vオプションは、Dockerホストの/をマウントします /exploitの下のコンテナへのディレクトリ ディレクトリ:

[root@131043f2e306 /]#ls exploit/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

マウントされているので、何でもできます Dockerホスト上。たとえば、ファイルを削除したり、特定の構成を編集してシステムに損害を与えたり、トロイの木馬アプリケーションやその他のマルウェアをインストールして重要な情報を盗んだりすることができます。

なぜこれが起こるのですか?

SELinuxは強制モードになっているので、なぜこれが可能なのか疑問に思われるかもしれません。 SELinuxを深く掘り下げて、どこで問題が発生したかを確認します。

SELinuxにDockerコンテキストがあることを確認します:

[mcalizo@Rhel82 ~]$ ps -eZ | grep docker
system_u:system_r:container_runtime_t:s0 30768 ? 00:00:04 dockerd
[mcalizo@Rhel82 ~]$

予想通り、そうです。これは、SELinuxがDockerデーモンを管理することを意味します。 Dockerデーモンを調べて、SELinuxがデフォルトで有効になっているかどうかを確認します。

[mcalizo@Rhel82 ~]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.18.0-193.el8.x86_64

SELinuxはではありません デフォルトで有効になっています。これが問題です!これを修正するには、ファイル/etc/docker/daemon.jsonを更新または作成して、SELinuxがDockerを制御および管理できるようにします。 ここに記載されているように(これを行うにはrootアクセス権が必要です):

[root@Rhel82 ~]# cat /etc/docker/daemon.json 
{
  "selinux-enabled": true
}
[root@Rhel82 ~]#
[root@Rhel82 ~]# systemctl restart docker

ファイルを作成または更新してDockerを再起動すると、DockerデーモンでSELinuxサポートが有効になっていることがわかります。

[root@Rhel82 ~]# systemctl restart docker
[mcalizo@Rhel82 root]$ docker info | grep Security -A3
 Security Options:
  seccomp
   Profile: default
  selinux
[mcalizo@Rhel82 root]$

DockerホストのDockerコンテナに特定のファイルシステムをマウントすることは引き続き可能ですが、ファイルの更新やアクセスは許可されなくなりました:

[mcalizo@Rhel82 root]$ docker run -it --rm -v /:/exploit fedora:latest /bin/bash
[root@ecb5836da1f6 /]# touch /exploit/etc/shadow.sh
touch: cannot touch '/exploit/etc/shadow.sh': Permission denied
[root@ecb5836da1f6 /]#
詳細

コンテナの世界での最初の防衛線は、コンテナホストのオペレーティングシステムをどれだけ強力にセットアップするかによって異なります。 Linuxのセキュリティを実装するには、セキュリティ体制を強化するために市場で入手可能なオプションなど、さまざまな方法があります。

SELinuxは、デフォルトでLinuxディストリビューションに組み込まれている追加のセキュリティレイヤーです。これを利用してシステムを侵害から保護するには、SELinuxがオンのままであることを確認してください。

詳細については、以下を参照してください:

  • CentOS 8/RHにDockerCEをインストールする方法
  • Dockerセキュリティチートシート
  • dockerdドキュメント
  • ボリュームのドキュメントを使用する
  • SELinuxとは何ですか?

Linux
  1. Asciinemaとのターミナルセッションを記録する

  2. LinuxメールサービスをSSL/TLSで保護する方法

  3. CSF ファイアウォールで Ubuntu サーバーを保護する方法

  1. LynisでLinuxセキュリティをスキャンする

  2. Linuxディストリビューションはまだコンテナーで重要ですか?

  3. tcpdumpを使用してネットワークのトラブルシューティングを行う

  1. AnsibleでSELinux強制モードを設定する

  2. Fail2BanでLinuxサーバーを保護する[初心者向けガイド]

  3. rsyncを使用してファイルをバックアップします