NJet KIC capabilities管理
NGINX 向云原生演进,All in OpenNJet
前言
从Linux 2.2开始,Linux将传统上与超级用户关联的特权划分为不同的单元(units),称为能力(capabilities),能力可以独立启用和禁用。能力是每个线程的属性。
Linux 有了capabilities机制,基于最小特权原则,可以按需给每个线程赋予需要的能力,而不是全部。从而降低了安全风险。
本文章,重点在于介绍在k8s环境中,使用NJet高级特性时,如何授予相应的能力。而不是介绍Linux capabilities机制和Linux capabilities 在docker中的应用。
NJet 哪些特性需要特权呢?
KIC中使用到的NJet特性,需要特权的特性如下:
- UDP代理(cap_net_admin\cap_net_raw)
 - TCP代理(cap_net_admin\cap_net_raw)
 - Bind 1024以下端口(cap_net_bind_service)
 - 修改进程用户id(cap_setuid)
 
NJet KIC capabilities管理
通过对NJet KIC进行 capabilities管理,使用101用户启动容器后,使KIC中使用到的需要特权的NJet特性可以正常工作。
K8s环境
| K8s版本 | 容器运行时 | Docker版 | 节点操作系统 | 
|---|---|---|---|
| v1.23.8 | Docker | 20.10.11 | CentOS Linux release 7.9.2009 | 
容器
通过deployment设置容器capability sets,deployment清单如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: njet-ingress
  namespace: njet-ingress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: njet-ingress
  template:
    metadata:
      labels:
        app: njet-ingress
     #annotations:
       #prometheus.io/scrape: "true"
       #prometheus.io/port: "9113"
       #prometheus.io/scheme: http
    spec:
      serviceAccountName: njet-ingress
      automountServiceAccountToken: true
      containers:
      - image: tmlake/njet-ingress:1.2
        imagePullPolicy: IfNotPresent
        name: njet-ingress
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: readiness-port
          containerPort: 8081
        - name: prometheus
          containerPort: 12001
        readinessProbe:
          httpGet:
            path: /nginx-ready
            port: readiness-port
          periodSeconds: 1
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
         #limits:
         #  cpu: "1"
         #  memory: "1Gi"
        securityContext:
          allowPrivilegeEscalation: true
          runAsUser: 101 #njet
          runAsNonRoot: true
          capabilities:
          drop:
            - ALL
            # Containers can start njet binaries, Excluding SETGID
            add:
            - NET_BIND_SERVICE
            - NET_ADMIN
            - NET_RAW
            - SETGID #You can use sudo
            - SETUID #You can use sudo
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/njet-config
          - -ingress-class=njet
          - -v=2
          - -ingress-version=networking/v1
          - -watch-endpointslices=true #true: k8s version > 1.21
         # - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
         #- -include-year
         #- -enable-cert-manager
         #- -enable-external-dns
         #- -v=3 # Enables extensive logging. Useful for troubleshooting.
         #- -report-ingress-status
         #- -external-service=nginx-ingress
         #- -enable-prometheus-metrics
         #- -global-configuration=$(POD_NAMESPACE)/nginx-configuration
正常启动后,登录njet-ingress容器内可以查看容器进程的capability sets:

由图可知容器内1 号进程/njet-ingress继承了 cap_setgid,cap_setuid,cap_net_bind_service,cap_net_admin,cap_net_raw能力集。effective set(一种Thread capability sets)没有被设置。
容器设置上述能力集,以便1号进程有权限创建子进程NJet。
NJet binary file
使用101用户启动容器后,容器中的进程effective set(一种Thread capability sets)是没有进程需要的capability sets。所以在制作容器镜像时需要对二进制文件设置需要的capability sets,设置方式如下:
RUN setcap 'cap_net_bind_service,cap_setuid,cap_net_admin,cap_net_raw=+eip' 
/usr/local/njet/sbin/njet 
正常启动后,登录njet-ingress容器内查看NJet进程的capability sets:

由图可知容器内 17 号进程 njet 继承了
cap_setgid,cap_setuid,cap_net_bind_service,cap_net_admin,cap_net_raw 能力集。CapEff 被授予二进制文件设置的
cap_setuid,cap_net_bind_service,cap_net_admin,cap_net_raw能力集,这样 njet 进程具有权限使用NJet特权特性了。
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。 邮件组 官网
关注公众号
					低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 
							
								
								    上一篇
								    
								
								GaussDB与openGauss有什么相同和不同?
众所周知,GaussDB是华为自主创新研发的分布式关系型数据库,为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务,openGauss是开源数据库,两者之间又是什么样的关系,有什么相同和不同,让我们一一展开来探讨。 一、产品定位 1、openGauss: 一款支持SQL2003标准语法,支持主备部署的高可用关系型数据库。 多种存储模式支持复合业务场景,新引入提供原地更新存储引擎。 NUMA化数据结构支持高性能。 Paxos一致性日志复制协议,主备模式,CRC校验支持高可用。 支持全密态计算、账本数据库等安全特性,提供全方位端到端的数据安全保护。 通过Table Access Method接口层支持多存储引擎。 2、GaussDB: 华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力,同时支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。 二、内核 1、G...
 - 
							
								
								    下一篇
								    
								
								RXThinkCMF 敏捷开发框架 Laravel10.x+Layui 版本 v2.0.0 发布
v2.0.0更新如下:1、新增Docker容器化解决方案;2、优化系统功能模块和文件结构;3、优化编码规范,统一命名和描述;4、优化数据库表结构和编码;5、优化模块页面,提升使用体验度;6、修复近期用户反馈的问题; 项目介绍 一款 PHP 语言基于 Laravel10.x、Layui、MySQL 等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架,框架已集成了完整的 RBAC 权限架构和常规基础模块,为了敏捷快速开发,提升研发效率,框架内置了一键 CRUD 代码生成器,自定义了模块生成模板,可以根据已建好的表结构 (字段注释需规范) 快速的一键生成整个模块的所有代码和增删改查等等功能业务,真正实现了低代码开发,极大的节省了人力成本的同时提高了开发效率,缩短了研发周期,是一款真正意义上实现组件化、...
 
相关文章
文章评论
共有0条评论来说两句吧...

			
				
				
				
				
				
				
				
微信收款码
支付宝收款码