docker ———— Communication cryptée TLS

1. La différence entre le conteneur Docker et la machine virtuelle

1. Isolement et partage

La machine virtuelle ajoute une couche d'hyperviseur pour virtualiser le matériel virtuel tel que les cartes réseau, la mémoire et le processeur, puis y créer des machines virtuelles. Chaque machine virtuelle possède son propre noyau système.
Le conteneur Docker isole le système de fichiers, le processus, l'équipement, le réseau et d'autres ressources grâce à l'isolation, puis contrôle les autorisations, les ressources du processeur, etc., afin que les conteneurs ne s'affectent pas et que le conteneur ne puisse pas affecter l'hôte. Le conteneur partage le noyau, le système de fichiers, le matériel et d'autres ressources avec l'hôte.

2. Performance et perte

Par rapport aux machines virtuelles, la consommation de ressources du conteneur est moindre. Sous le même hôte, il est possible de créer plus de conteneurs que de machines virtuelles. Cependant, la sécurité d'une machine virtuelle est légèrement meilleure que celle d'un conteneur.Il
est extrêmement difficile de franchir la couche Hypervisor pour passer d'une machine virtuelle à un hôte ou à d'autres machines virtuelles. Le conteneur Docker partage des ressources telles que le noyau et le système de fichiers avec l'hôte, ce qui est plus susceptible d'avoir un impact sur les autres conteneurs et l'hôte.

Deuxièmement, les problèmes de sécurité de Docker

1. Les propres vulnérabilités de Docker

En tant qu'application, Docker lui-même a des failles de code dans son implémentation. CVE enregistre officiellement plus de 20 vulnérabilités dans la version historique de Docker. Les principales méthodes d'attaque couramment utilisées par les pirates sont l'exécution de code, l'élévation de privilèges, la fuite d'informations et le contournement de privilèges. La version actuelle de Docker change très rapidement et il est préférable pour les utilisateurs de Docker de mettre à niveau Docker vers la dernière version.

2. Problème de code source Docker

Docker fournit un hub Docker, qui permet aux utilisateurs de télécharger les images créées pour que d'autres utilisateurs les téléchargent et créent rapidement l'environnement. Mais cela entraîne également des problèmes de sécurité. Par exemple, les trois méthodes suivantes:
(1) Les pirates téléchargent des images malveillantes. Si des pirates implantent des chevaux de Troie, des portes dérobées et d'autres logiciels malveillants dans les images créées, l'environnement ne sera pas sécurisé dès le début et il n'y aura plus de sécurité à l'avenir .

(2) Les miroirs utilisent des logiciels vulnérables. Parmi les miroirs qui peuvent être téléchargés sur Docker Hub, 75% des miroirs ont un logiciel vulnérable installé. Par conséquent, après avoir téléchargé l'image miroir, vous devez vérifier les informations de version du logiciel à l'intérieur, si la version correspondante présente des vulnérabilités, la mettre à jour et la corriger à temps.

(3) Attaque de l'homme du milieu La falsification de l'image miroir peut être falsifiée pendant la transmission La nouvelle version de Docker a fourni un mécanisme de vérification correspondant pour éviter ce problème.

Troisièmement, les défauts de l'architecture Docker et les mécanismes de sécurité

L'architecture et le mécanisme de Docker peuvent causer des problèmes. Par exemple, dans un tel scénario d'attaque, le pirate a contrôlé certains conteneurs sur l'hôte ou a obtenu un moyen de créer un conteneur sur le cloud public, puis de lancer une attaque sur l'hôte ou autres conteneurs.
1. == Attaques LAN entre conteneurs == Les conteneurs sur l'
hôte peuvent former un LAN, donc des méthodes d'attaque telles que l'usurpation ARP, le reniflement et les tempêtes de diffusion contre le LAN peuvent être utilisées.
Par conséquent, le déploiement de plusieurs conteneurs sur un hôte nécessite une configuration réseau raisonnable et des règles iptables.

2. == Les attaques DDoS épuisent les ressources == Le
mécanisme de sécurité de Cgroups est d'empêcher de telles attaques. N'allouez pas trop de ressources à un seul conteneur pour éviter de tels problèmes.

3. 、Appel système vulnérable
Une différence importante entre Docker et les machines virtuelles est que Docker et l'hôte partagent le même noyau de système d'exploitation.
Une fois que le noyau de l'hôte a des vulnérabilités qui peuvent être remplacées ou augmentées, bien que Docker utilise des utilisateurs ordinaires pour s'exécuter, lorsque le conteneur est envahi, l'attaquant peut également utiliser les vulnérabilités du noyau pour accéder à l'hôte pour en faire plus.

4 、Autorisations utilisateur root partagées
Si vous exécutez le conteneur avec des privilèges d'utilisateur root, l'utilisateur root dans le conteneur a également des privilèges root sur l'hôte.

Quatre, normes de base de sécurité Docker

Ce qui suit 内核、主机、网络、镜像、容器以及其它résume les normes de base de sécurité Docker sous six aspects.

1. Niveau du noyau

  • Mettre à jour le noyau à temps
  • User NameSpace (l'autorisation racine dans le conteneur est dans un état d'autorisation non élevé en dehors du conteneur)
  • Cgroups (quota et mesure des ressources)
  • SELiux / AppArmor / GRSEC (autorité d'accès aux fichiers de contrôle)
  • Capacité (division d'autorisation)
  • Seccomp (appel système limité)
  • Il est interdit de partager l'espace de noms du conteneur avec l'espace de noms du processus hôte

2. Niveau d'hôte

  • Créer une partition distincte pour le conteneur
  • Exécuter uniquement les services nécessaires
  • Interdire le mappage des répertoires sensibles sur l'hôte vers le conteneur
  • Auditer le démon Docker, les fichiers et répertoires associés
  • Définissez un nombre approprié de descripteurs de fichier par défaut
    • Descripteur de fichier: le noyau utilise des descripteurs de fichier pour accéder aux fichiers. Le descripteur de fichier est un entier non négatif.
      Lors de l'ouverture d'un fichier existant ou de la création d'un nouveau fichier, le noyau renvoie un descripteur de fichier. La lecture et l'écriture de fichiers doivent également utiliser des descripteurs de fichiers pour spécifier les fichiers à lire et à écrire
  • Les autorisations d'accès des fichiers liés à Docker avec des autorisations utilisateur en tant que root doivent être de 644 ou moins
  • Vérifiez périodiquement la liste des conteneurs de chaque hôte et nettoyez les conteneurs inutiles

3. Niveau du réseau

  • Définissez des règles via iptables pour interdire ou autoriser le trafic réseau entre les conteneurs
  • Autoriser Docker à modifier iptables
  • Il est interdit de lier Docker à d'autres IP / Port ou Unix Socket
  • Interdire le mappage des ports privilégiés sur le conteneur
  • Ouvrez uniquement les ports requis sur le conteneur
  • Interdire l'utilisation du mode réseau hôte sur le conteneur
  • Si la machine hôte a plusieurs cartes réseau, liez le trafic entrant du conteneur à une carte réseau hôte spécifique

4. Niveau du miroir

  • Créer un serveur d'entrepôt miroir local
  • Le logiciel dans le miroir est la dernière version
  • Utilisez des fichiers image fiables et téléchargez via des canaux sécurisés
  • Reconstruisez l'image au lieu de patcher le conteneur et l'image
  • Gérez raisonnablement les balises miroir et supprimez les miroirs qui ne sont plus utilisés en temps opportun
  • Utiliser le scan miroir
  • Utiliser la signature miroir

5. Niveau du conteneur

  • Conteneur réduit, ensemble minimal d'images du système d'exploitation
  • Le conteneur fonctionne comme un processus principal unique
  • Interdire aux balises privilégiées d'utiliser des conteneurs privilégiés
  • Interdire l'exécution du service SSH sur le conteneur
  • Montez le système de répertoires racine du conteneur en lecture seule
  • Définissez clairement la lettre du lecteur de données appartenant au conteneur
  • En définissant en cas d'échec pour limiter le nombre de tentatives de redémarrage du conteneur, les redémarrages répétés du conteneur peuvent facilement perdre des données
  • Limitez l'arborescence de processus disponible dans le conteneur pour éviter les bombes à fourche. (Fork bomb, croissance rapide des processus enfants, épuisement du nombre de processus système)

6. Autres paramètres

  • Effectuer régulièrement des audits de sécurité sur le système hôte et les conteneurs
  • Exécutez le conteneur avec un minimum de ressources et d'autorisations
  • Évitez de déployer un grand nombre de conteneurs sur le même hôte et conservez un nombre gérable
  • Surveillez l'utilisation, les performances et d'autres indicateurs des conteneurs Docker
  • Ajoutez des fonctions de détection des menaces et de réponse aux incidents en temps réel
  • Utiliser les services de collecte de journaux centralisés et distants

5. Minimisez le conteneur

Si seuls les services nécessaires sont exécutés dans le conteneur, comme SSH 等服务是不能轻易开启去连接容器的. Les méthodes suivantes sont généralement utilisées pour entrer dans le conteneur.

docker exec -it xxxxxxxxx bash

Six, contrôle d'accès à l'API à distance Docker

L'interface d'API d'appel à distance de Docker présente des vulnérabilités d'accès non autorisé, et au moins l'accès au réseau externe doit être restreint. Il est recommandé d'utiliser Socket pour accéder. Pour surveiller l'IP du réseau interne, la méthode de démarrage du démon docker est la suivante.

docker -d -H uninx:///var/run/docker.sock -H tcp://192.168.241.3:2375
或者
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.241.3:2375

systemctl daemon-reload
systemctl restart docker

然后,在宿主机的 firewalld 上做 IP 访问控制即可。(source address 是客户端地址),这里需要注意的是firwalld的服务要打开,否则无法使用这个命令
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.241.20" port protocol="tcp" port="2375" accept"
firewall-cmd --reload

#客户端操作实现远程调用
docker -H tcp://192.168.241.3 images

Insérez la description de l'image ici
Insérez la description de l'image ici

Sept, restreindre le flux du trafic

Utilisez des filtres de pare-feu pour restreindre la plage d'adresses IP source du conteneur Docker pour communiquer avec le monde extérieur.

firewall-cmd --permanent --zone = public --add-rich-rule = "rule family =" ipv4 "source address =" 192.168.241.0/24 "rejeter"

Un grand nombre de problèmes sont causés par des vulnérabilités causées par la version externe des ports de conteneurs Docker. Outre le problème du contrôle des autorisations de compte du système d'exploitation, il s'agit également d'un danger caché dans la gestion des processus de Docker Daemon. Actuellement, les versions Docker couramment utilisées prennent en charge Docker Daemon pour gérer les iptables de l'hôte, et une fois que le processus est démarré et que le mappage de port de -p host_port: guest_port est ajouté,
Docker Daemon augmentera directement la chaîne FORWARD correspondante et -j ACCEPT, et la règle DROP par défaut est dans La chaîne INPUT ne restreint pas le menu fixe,
ce qui laisse un risque de sécurité sérieux. Par conséquent, il est recommandé:

  • N'utilisez pas le service Docker sur des machines avec une adresse IP de réseau externe
  • Utilisez le système d'orchestration Docker tel que k8s pour gérer les conteneurs Docker
  • Ajoutez un –iptables = false à la commande de démarrage du démon Docker sur l'hôte, puis écrivez les iptables couramment utilisés dans le fichier, puis utilisez iptables-restore pour actualiser.

8. Mise en miroir de la sécurité

Analyse de sécurité de l'image Docker, utilisez l'authentification par certificat sur le client de l'entrepôt miroir pour vérifier l'image téléchargée. En analysant le miroir de manière synchrone avec la base de données CVE, les utilisateurs seront avertis de traiter toutes les vulnérabilités une fois qu'elles sont trouvées, ou le miroir peut être directement empêché de continuer à se construire.
Si l'entreprise utilise sa propre source miroir, vous pouvez ignorer cette étape; sinon, au moins le md5 et d'autres valeurs caractéristiques de l'image de base doivent être vérifiés, puis l'image de base est confirmée comme étant cohérente avant la construction ultérieure basée sur l'image de base . En général, assurez-vous de n'obtenir des images qu'à partir de bibliothèques approuvées et il n'est pas recommandé d'utiliser le paramètre –insecure-registry = []. Il est recommandé d'utiliser l'entrepôt privé du port.

Neuf, communication cryptée Docker-TLS⭐

为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中 间人攻击,c/s 两端应该通过加密方式通讯。
1. Créez un répertoire tls, modifiez le nom du nœud maître et configurez la résolution d'adresse

mkdir /tls
cd /tls

hostnamectl set-hostname master
su

vim /etc/hosts
127.0.0.1   master

Insérez la description de l'image ici

2. Créez une authentification de couplage

1、创建ca密钥
openssl genrsa -aes256 -out ca-key.pem 4096				# 密码输入111111

Generating RSA private key, 4096 bit long modulus
..................................................................++
.............................................++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:

# rsa:非对称密钥,位数256位,-out 输出密钥文件ca-key.pem

Insérez la description de l'image ici

# 生成了密钥证书文件,目前只是一个原材料,使用该密钥去制造CA证书
2、创建ca证书
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem				# 密码输入111111

拓展:
x509是证书的国际标准格式
days:证书的有效期
sha:hash算法
subj:项目名称“”里的内容自定义
out:输出

Insérez la description de l'image ici

3、创建服务器私钥
openssl genrsa -out server-key.pem 4096 

Insérez la description de l'image ici

4、签名私钥
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

Insérez la description de l'image ici

5、使用ca证书与私钥证书签名
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem			
Signature ok
subject=/CN=*
Getting CA Private Key
Enter pass phrase for ca-key.pem:#输入111111

Insérez la description de l'image ici

6、生成客户端密钥
openssl genrsa -out key.pem 4096

Insérez la description de l'image ici

7、签名客户端
openssl req -subj "/CN=client" -new -key key.pem -out client.csr

Insérez la description de l'image ici

8、创建配置文件
echo extendedKeyUsage=clientAuth > extfile.cnf

Insérez la description de l'image ici

9、签名证书,需要(签名客户端,ca证书,ca密钥)
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf				
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:	#输入111111

Insérez la description de l'image ici

10、删除多余的文件,只留下.pem结尾的文件
rm -rf ca.srl client.csr extfile.cnf server.csr

Insérez la description de l'image ici
Insérez la description de l'image ici

11、设置docker的配置文件并重启进程及docker服务
vim /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock			#添加

systemctl daemon-reload
systemctl restart docker

Insérez la description de l'image ici
Insérez la description de l'image ici

12、将ca.pem、cert.pem、key.pem三个文件用scp导入到客户端的/etc/docker目录下
scp ca.pem root@192.168.241.20:/etc/docker/
scp cert.pem root@192.168.241.20:/etc/docker/
scp key.pem root@192.168.241.20:/etc/docker/

Insérez la description de l'image ici
Insérez la description de l'image iciInsérez la description de l'image ici

13、主节点上验证
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version

Insérez la description de l'image ici

14、client端验证
# 这里得先将master的地址加入到/etc/hosts里
vim /etc/hosts
192.168.241.3 master

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images

Insérez la description de l'image ici

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51432789/article/details/115347427
conseillé
Classement