昇腾社区首页
中文
注册
开发者
下载

TaskD安全加固

TaskD运行后,会启动gRPC客户端与ClusterD进行gRPC通信,同时TaskD内部组件(Manager、Proxy、Agent、Worker)之间也存在gRPC通信。TaskD默认情况下会使用非安全的gRPC通信方式,用户可采用TLS/SSL加密方式通信,防止通信过程被攻击。

下面将以nginx为例,指导用户通过本地网络代理对TaskD跨节点的通信进行加密认证。

前提条件

在进行双向认证前,用户需准备好以下证书文件。

  • rootCA.crt
  • client.crt
  • client.key
  • server.crt
  • server.key

操作步骤

  1. 拉取nginx镜像。
    docker pull nginx
  2. 前提条件中的全部证书文件放入路径A下。
  3. 准备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;
      }
     }
    }
  4. 单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;
      }
     }
    }
  5. 在任务YAML中注入使用本地代理的环境变量。
              env:
                  - name: TTP_PORT             
                    value: "8000"
                  - name: LOCAL_PROXY_ENABLE
                    value: "on"          # 使用本地代理通信的开关
  6. 在任务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中的文件路径
    
  7. 进入任务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