Docker ———— Comunicación cifrada TLS

1. La diferencia entre el contenedor Docker y la máquina virtual

1. Aislamiento e intercambio

La máquina virtual agrega una capa de hipervisor para virtualizar hardware virtual como tarjetas de red, memoria y CPU, y luego construir máquinas virtuales en él.Cada máquina virtual tiene su propio kernel de sistema.
El contenedor Docker aísla el sistema de archivos, el proceso, el equipo, la red y otros recursos mediante el aislamiento, y luego controla los permisos, los recursos de la CPU, etc., para que los contenedores no se afecten entre sí y el contenedor no pueda afectar al host. El contenedor comparte el kernel, el sistema de archivos, el hardware y otros recursos con el host.

2. Rendimiento y pérdida

En comparación con las máquinas virtuales, el consumo de recursos de contenedores es menor. Bajo el mismo host, se pueden crear más contenedores que máquinas virtuales. Sin embargo, la seguridad de una máquina virtual es ligeramente mejor que la de un contenedor
Es extremadamente difícil atravesar la capa del hipervisor para pasar de una máquina virtual a un host u otras máquinas virtuales. El contenedor de la ventana acoplable comparte recursos como el kernel y el sistema de archivos con el host, lo que es más probable que tenga un impacto en otros contenedores y en el host.

En segundo lugar, los problemas de seguridad de Docker.

1. Las propias vulnerabilidades de Docker

Como aplicación, Docker tiene fallas de código en su implementación. CVE registra oficialmente más de 20 vulnerabilidades en la versión histórica de Docker. Los principales métodos de ataque comúnmente utilizados por los piratas informáticos son la ejecución de código, la escalada de privilegios, la fuga de información y la omisión de privilegios. La versión actual de Docker cambia muy rápidamente, y es mejor que los usuarios de Docker actualicen Docker a la última versión.

2. Problema del código fuente de Docker

Docker proporciona un centro de Docker, que permite a los usuarios cargar las imágenes creadas para que otros usuarios las descarguen y creen rápidamente el entorno. Pero también trae algunos problemas de seguridad. Por ejemplo, los siguientes tres métodos:
(1) Los piratas informáticos cargan imágenes maliciosas. Si los piratas informáticos implantan caballos de Troya, puertas traseras y otro software malicioso en las imágenes creadas, el entorno será inseguro desde el principio y no habrá seguridad en el futuro. .

(2) Los espejos utilizan software vulnerable. De los espejos que se pueden descargar en Docker Hub, el 75% de los espejos tienen instalado software vulnerable. Por lo tanto, después de descargar la imagen reflejada, debe verificar la información de la versión del software en el interior, si la versión correspondiente tiene vulnerabilidades, y actualizarla y parchearla a tiempo.

(3) La manipulación de la imagen reflejada mediante un ataque man-in-the-middle puede ser manipulada durante la transmisión. La nueva versión de Docker ha proporcionado un mecanismo de verificación correspondiente para evitar este problema.

Tres, defectos de la arquitectura de Docker y mecanismos de seguridad.

La propia arquitectura y el mecanismo de Docker pueden causar problemas. Por ejemplo, en un escenario de ataque de este tipo, el pirata informático ha controlado algunos contenedores en el host u obtenido una forma de construir un contenedor en la nube pública y luego iniciar un ataque en el host o otros contenedores ataque.
1. == Ataques de LAN entre contenedores == Los contenedores en el
host pueden formar una LAN, por lo que se pueden usar métodos de ataque como suplantación de ARP, rastreo y tormentas de difusión contra la LAN.
Por lo tanto, la implementación de varios contenedores en un host requiere una configuración de red razonable y reglas de iptable.

2. == Los ataques DDoS agotan los recursos ==
El mecanismo de seguridad de Cgroups es prevenir tales ataques No asigne demasiados recursos a un solo contenedor para evitar tales problemas.

3. 、Llamada al sistema vulnerable
Una diferencia importante entre Docker y las máquinas virtuales es que Docker y el host comparten el mismo kernel del sistema operativo.
Una vez que el kernel del host tiene vulnerabilidades que se pueden anular o escalar, aunque Docker usa usuarios normales para ejecutar, cuando el contenedor es invadido, el atacante también puede usar las vulnerabilidades del kernel para saltar al host y hacer más.

4 、Permisos de usuario raíz compartidos
Si ejecuta el contenedor con privilegios de usuario root, el usuario root del contenedor también tiene privilegios de root en el host.

Cuatro, estándares básicos de seguridad de Docker

A continuación, se 内核、主机、网络、镜像、容器以及其它resumen los estándares básicos de seguridad de Docker desde seis aspectos.

1. Nivel de kernel

  • Actualice el kernel a tiempo
  • User NameSpace (el permiso de root en el contenedor está en un estado de permiso no alto fuera del contenedor)
  • Cgroups (cuota y medición de recursos)
  • SELiux / AppArmor / GRSEC (Autoridad de acceso a archivos de control)
  • Capacidad (división de autorización)
  • Seccomp (llamada de sistema limitada)
  • Está prohibido compartir el espacio de nombres del contenedor con el espacio de nombres del proceso del host.

2. Nivel de anfitrión

  • Cree una partición separada para el contenedor
  • Ejecute solo los servicios necesarios
  • Prohibir la asignación de directorios confidenciales en el host al contenedor
  • Audite el demonio de Docker, los archivos y directorios relacionados
  • Establecer un número apropiado de descriptores de archivo predeterminados
    • Descriptor de archivo: el kernel usa descriptores de archivo para acceder a los archivos. El descriptor de archivo es un número entero no negativo.
      Al abrir un archivo existente o crear uno nuevo, el kernel devuelve un descriptor de archivo. La lectura y escritura de archivos también necesitan usar descriptores de archivo para especificar los archivos que se leerán y escribirán.
  • Los permisos de acceso de los archivos relacionados con Docker con permisos de usuario como root deben ser 644 o menos
  • Verifique periódicamente la lista de contenedores de cada host y limpie los contenedores innecesarios

3. Nivel de red

  • Establezca reglas a través de iptables para prohibir o permitir el tráfico de red entre contenedores
  • Permitir que Docker modifique iptables
  • Está prohibido vincular Docker a otra IP / Puerto o Socket Unix
  • Prohibir la asignación de puertos privilegiados en el contenedor.
  • Abra solo los puertos requeridos en el contenedor
  • Prohibir el uso del modo de red de host en el contenedor.
  • Si la máquina host tiene varias tarjetas de red, vincule el tráfico entrante del contenedor a una tarjeta de red host específica

4. Nivel del espejo

  • Crear un servidor de almacén reflejado local
  • El software en el espejo es la última versión.
  • Use archivos de imagen confiables y descargue a través de canales seguros
  • Reconstruir la imagen en lugar de parchear el contenedor y la imagen
  • Administre las etiquetas espejo de manera razonable y elimine los espejos que ya no se utilizan de manera oportuna
  • Usar escaneo espejo
  • Usar firma espejo

5. Nivel del contenedor

  • Contenedor minimizado, conjunto mínimo de imágenes del sistema operativo
  • El contenedor se ejecuta como un único proceso principal.
  • Prohibir que las etiquetas privilegiadas utilicen contenedores privilegiados
  • Prohibir la ejecución del servicio ssh en el contenedor.
  • Monte el sistema de directorio raíz del contenedor de forma de solo lectura
  • Defina claramente la letra de la unidad de datos que pertenece al contenedor
  • Al establecer en caso de falla para limitar el número de intentos de reinicio del contenedor, los reinicios repetidos del contenedor pueden perder datos fácilmente
  • Limite el árbol de proceso disponible en el contenedor para evitar bombas de horquilla. (Bomba de horquilla, crecimiento rápido de procesos secundarios, agotando la cantidad de procesos del sistema)

6. Otros entornos

  • Realice periódicamente auditorías de seguridad en el sistema host y los contenedores.
  • Ejecute el contenedor con recursos y permisos mínimos
  • Evite implementar una gran cantidad de contenedores en el mismo host y mantenga un número manejable
  • Supervisar el uso, el rendimiento y otros indicadores de los contenedores de Docker.
  • Agregue funciones de respuesta a incidentes y detección de amenazas en tiempo real
  • Utilice los servicios de recopilación de registros centrales y remotos

5. Minimizar el contenedor

Si solo se ejecutan los servicios necesarios en el contenedor, como SSH 等服务是不能轻易开启去连接容器的. Los siguientes métodos se utilizan generalmente para ingresar al contenedor.

docker exec -it xxxxxxxxx bash

Seis, control de acceso a la API remota de Docker

La interfaz API de llamadas remotas de Docker tiene vulnerabilidades de acceso no autorizado, y al menos el acceso a la red externa debe estar restringido. Se recomienda utilizar Socket para acceder. Para monitorear la IP de la red interna, el método de inicio del demonio de la ventana acoplable es el siguiente.

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Siete, restringe el flujo de tráfico

Utilice filtros de firewall para restringir el rango de direcciones IP de origen del contenedor Docker para comunicarse con el mundo exterior.

firewall-cmd --permanent --zone = public --add-rich-rule = "familia de reglas =" ipv4 "dirección de origen =" 192.168.241.0/24 "rechazar"

Una gran cantidad de problemas son causados ​​por vulnerabilidades causadas por la liberación externa de los puertos del contenedor Docker. Además del problema del control de permisos de la cuenta del sistema operativo, también es un peligro oculto en la gestión de procesos de Docker Daemon. Actualmente, las versiones de Docker de uso común admiten Docker Daemon para administrar las iptables del host, y una vez que se inicia el proceso y se agrega la asignación de puertos de -p host_port: guest_port,
Docker Daemon aumentará directamente la cadena FORWARD correspondiente y -j ACCEPT, y la regla DROP predeterminada está en La cadena INPUT no restringe la ventana acoplable, lo
que deja un grave riesgo de seguridad. Por eso se recomienda:

  • No use el servicio Docker en máquinas con IP de red externa
  • Utilice el sistema de orquestación de Docker, como k8s, para administrar los contenedores de Docker.
  • Agregue un –iptables = false al comando de inicio del demonio Docker en el host, luego escriba las iptables de uso común en el archivo y luego use iptables-restore para actualizar.

8. Seguridad reflejada

Escaneo de seguridad de la imagen de Docker, use la autenticación de certificado en el cliente del almacén espejo para verificar la imagen descargada. Al escanear el espejo de forma sincrónica con la base de datos CVE, se notificará a los usuarios para que se ocupen de cualquier vulnerabilidad una vez que se encuentren, o se puede evitar directamente que el espejo continúe construyéndose.
Si la empresa está utilizando su propia fuente de espejo, puede omitir este paso; de lo contrario, es necesario verificar al menos el md5 y otros valores característicos de la imagen base, y luego se confirma que la imagen base es consistente antes de continuar con la construcción basada en la imagen base. . En general, asegúrese de obtener solo imágenes de bibliotecas confiables, y no se recomienda usar el parámetro –insecure-registry = []. Se recomienda usar el almacén privado del puerto.

Nueve, comunicación encriptada Docker-TLS⭐

为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中 间人攻击,c/s 两端应该通过加密方式通讯。
1. Cree un directorio tls, modifique el nombre del nodo maestro y configure la resolución de direcciones

mkdir /tls
cd /tls

hostnamectl set-hostname master
su

vim /etc/hosts
127.0.0.1   master

Inserte la descripción de la imagen aquí

2. Crear autenticación de emparejamiento

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

Inserte la descripción de la imagen aquí

# 生成了密钥证书文件,目前只是一个原材料,使用该密钥去制造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:输出

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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/

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_51432789/article/details/115347427
Recomendado
Clasificación