即使在设置cap_net_raw之后,也无法在linux容器中打开原始套接字

sczxawaw  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(116)

我正在运行一段代码,它打开了一个docker容器中的原始socket,其中kubernetes作为orchestrator。
下面是我的示例代码:

#include <stdio.h>  
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>

int main (void)
{  
        //Create a raw socket
        int s = socket (AF_INET, SOCK_RAW, IPPROTO_SCTP);

        if(s == -1)
        {
                perror("Failed to create socket");
                exit(1);
        }

}

字符串
在我的container/pod中以非root用户身份运行代码时,我得到了这个错误。

./rawSocTest
Failed to create socket: Operation not permitted


这是显而易见的,因为它需要根级别的权限才能打开原始套接字。我通过设置capability cap_net_raw纠正了这个问题。

getcap rawSocTest
rawSocTest = cap_net_raw+eip


当我再次运行它。我得到一个不同的错误。

./rawSocTest
bash: ./rawSocTest: Permission denied


根据我的理解,设置功能应该已经解决了我的问题。我错过了什么吗?或者这是容器的已知限制吗?
先谢谢你。

btqmn9zl

btqmn9zl1#

我解决了我需要在kubernetes部署的容器安全上下文部分设置功能。我添加了NET_RAW功能以允许创建原始套接字。我的印象是,在构建过程中只需添加capnet raw功能就足够了。但我的理解是错误的。
我做了一些研究并清理了部署解决方案。我在pod安全策略的允许功能部分添加了NET_RAW。然后创建角色并进行角色绑定。通过rolebinding将其链接到将部署我的pod的名称空间中的服务帐户。然后在pod部署中使用此serviceAccount。不确定这是否是一个好的解决方案。

soat7uwm

soat7uwm2#

我使用用户kubernetes-admin运行了它
将容器定义的示例部署文件添加到前面所述的内容中

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
  labels:
    app: httpd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: my-apache2
        image: docker.io/arunsippy12/my-apache2:latest
        securityContext:
         allowPrivilegeEscalation: true
         capabilities:
          add: ["NET_RAW"]
        ports:
        - containerPort: 80

字符串
也可以参考k8s文档:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

相关问题