TaskD安全加固
TaskD运行后,会启动gRPC客户端与ClusterD进行gRPC通信,同时TaskD内部组件(Manager、Proxy、Agent、Worker)之间也存在gRPC通信。TaskD默认情况下会使用非安全的gRPC通信方式,用户可采用TLS/SSL加密方式通信,防止通信过程被攻击。
下面将以nginx为例,指导用户通过本地网络代理对TaskD跨节点的通信进行加密认证。
操作步骤
- 拉取nginx镜像。
docker pull nginx
- 将前提条件中的全部证书文件放入路径A下。
- 准备master Pod的nginx代理配置文件。在路径A下新建一个文件夹conf,在该文件夹下新建一个名为master_nginx.conf的文件,并将以下内容写入文件中:
worker_processes 1; worker_cpu_affinity 0001; worker_rlimit_nofile 4096; events { worker_connections 4096; } http { access_log /etc/nginx/access.log; error_log /etc/nginx/error.log; server { listen 127.0.0.1:8899; http2 on; location / { grpc_pass grpcs://{ClusterD的Pod IP}:9500; grpc_ssl_verify on; grpc_ssl_trusted_certificate /etc/nginx/rootCA.crt; grpc_ssl_certificate /etc/nginx/client.crt; grpc_ssl_certificate_key /etc/nginx/client.key; grpc_ssl_verify_depth 2; grpc_ssl_protocols TLSv1.2 TLSv1.3; grpc_ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; grpc_ssl_name {服务证书中的SAN或CN}; } } # 单pod任务无需配置如下server server { listen {master pod的IP}:9601 ssl; proxy_ssl_session_reuse off; http2 on; ssl_certificate /etc/nginx/server.crt; # 服务端证书路径(权限400) ssl_certificate_key /etc/nginx/server.key; # 服务端私钥路径,私钥不能明文配置(权限400) ssl_client_certificate /etc/nginx/rootCA.crt; # 根证书路径 ssl_verify_client on; ssl_verify_depth 2; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; location / { grpc_pass grpc://127.0.0.1:9601; } } } - 单Pod任务请跳过本步骤。准备worker Pod的nginx代理配置文件。在路径A下新建一个文件夹conf,在该文件夹下新建一个名为worker_nginx.conf的文件,并将以下内容写入文件中。
worker_processes 1; worker_cpu_affinity 0001; worker_rlimit_nofile 4096; events { worker_connections 4096; } http { access_log /etc/nginx/access.log; error_log /etc/nginx/error.log; server { listen 127.0.0.1:9601; http2 on; location / { grpc_pass grpcs://{master svc ip}:9601; # svc ip地址可通过kubectl get svc -A |grep {jobname}命令进行查询 grpc_ssl_verify on; grpc_ssl_trusted_certificate /etc/nginx/rootCA.crt; grpc_ssl_certificate /etc/nginx/client.crt; grpc_ssl_certificate_key /etc/nginx/client.key; grpc_ssl_verify_depth 2; grpc_ssl_protocols TLSv1.2 TLSv1.3; grpc_ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; grpc_ssl_name DomainCA.com; } } } - 在任务YAML中注入使用本地代理的环境变量。
env: - name: TTP_PORT value: "8000" - name: LOCAL_PROXY_ENABLE value: "on" # 使用本地代理通信的开关 - 在任务Pod中新增如下加粗字段。
# Deployment中的containers项增加 - name: nginx image: nginx:latest imagePullPolicy: Never command: [ "/bin/bash", "-c", "--"] args: [ "sleep infinity" ] volumeMounts: - name: nginx-conf mountPath: /etc/nginx # Deployment中的volumes项增加 - name: nginx-conf hostPath: path: /{路径A}/ # nginx启动配置文件和证书密钥文件所在路径,请将路径A替换成步骤2中的文件路径 - 进入任务Pod启动nginx,包括master pod nginx和worker pod nginx。单Pod任务请跳过本步骤。
## 进入nginx容器 kubectl exec -it -n {任务 namespace} {任务pod name} -c nginx bash ## 执行以下命令启动nginx,并根据提示输入密钥口令 nginx -c /etc/nginx/conf/{master或worker}_nginx.conf
父主题: 安全加固