1
votes

OpenShift: Accéder au système de fichiers monté en tant que non-root

J'essaie d'exécuter Chart Museum en tant qu'utilisateur non root dans OpenShift. Voici un aperçu de mon YAML.

FROM alpine:3.10.3
RUN apk add --no-cache cifs-utils ca-certificates \
    && adduser -D -u 1000 chartmuseum
COPY bin/linux/amd64/chartmuseum /chartmuseum
USER 1000
ENTRYPOINT ["/chartmuseum"]

Comme vous pouvez le voir, j'ai défini spec.containers.securityContext.fsGroup sur 1000 qui est identique à l'ID utilisateur dans le Dockerfile Chart Museum comme indiqué ci-dessous.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: chart-museum
  namespace: demo
spec:
  selector:
    matchLabels:
      app: chart-museum
  replicas: 1
  template:
    metadata:
      labels:
        app: chart-museum
    spec:
      volumes:
        - name: pvc-charts
          persistentVolumeClaim:
            claimName: pvc-charts      
      containers:
        - name: chart-museum
          securityContext:
            fsGroup: 1000
          image: chartmuseum/chartmuseum:latest
          ports:
            - containerPort: 8080
          envFrom:
            - configMapRef:
                name: chart-museum
          volumeMounts:
            - name: pvc-charts
              mountPath: "/charts"

Et, pourtant, quand j'essaye de télécharger un graphique , je reçois un message d'autorisation refusée pour / charts code>. Comment contourner ce problème?


0 commentaires

3 Réponses :


0
votes

Il est lié à Kubernetes et à la façon dont le volume persistant donné est défini. Vous pouvez consulter toutes les discussions et les solutions de contournement possibles dans le problème GH associé .


1 commentaires

Laissez-moi essayer l'option d'ajouter un chown ( github .com / kubernetes / kubernetes / issues /… ) Comme mentionné dans ma question, l'option fsGroup ( github.com/kubernetes/kubernetes/issues/... ) n'a pas fonctionné pour moi en fait.



0
votes

Ajoutez les lignes chmod / chown dans votre fichier docker:

      containers:
        - name: chart-museum
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000
            fsGroup: 1000

Modifiez votre spec.template.spec.containers.securityContext en assurez-vous que l'utilisateur et le groupe seront appliqués.

FROM alpine:3.10.3
RUN apk add --no-cache cifs-utils ca-certificates \
    && adduser -D -u 1000 chartmuseum
COPY bin/linux/amd64/chartmuseum /chartmuseum
RUN chmod +xr /chartmuseum
RUN chown 1000:1000 /chartmuseum
USER 1000
ENTRYPOINT ["/chartmuseum"]


2 commentaires

Le YAML pour le déploiement était considéré comme valide uniquement lorsque fsGroup était supprimé. Ensuite, le déploiement a échoué avec cette raison impossible de valider par rapport à une contrainte de contexte de sécurité: [spec.containers [0] .securityContext.securityContext.runAsUse‌ r: Valeur non valide: 1000: doit être dans les plages: [1000350000, 1000359999]]


Le problème vient de / charts . Comment votre Dockerfile résout-il ce problème? Et avec spec.template.spec.containers , fsGroup a été appelé comme invalide. Les valeurs numériques de runAsUser et runAsGroup ont été jugées trop faibles et le conteneur n'a jamais démarré.



0
votes

Voici comment j'ai résolu le problème.

  1. Téléchargez le binaire curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum .
  2. Modifier les autorisations chmod + xr chartmuseum
  3. Créez un nouveau Dockerfile comme indiqué ci-dessous. En gros, utilisez le nom d'utilisateur au lieu de l'ID pour les commandes chown afin que le binaire et l'emplacement de stockage appartiennent à l'utilisateur chartmuseum et non à root .
 docker run --rm -it \
  -p 8080:8080 \
  -v $(pwd)/charts:/charts \
  -e DEBUG=true \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  chartmuseum/chartmuseum:latest
  1. Construisez et poussez l'image Docker résultante vers par ex. somerepo / chartmuseum: 0.0.0 .
  2. Utilisez le manifeste k8s comme indiqué ci-dessous. Modifiez l'espace de noms selon vos besoins. Remarque , la création de PersistentVolumeClaim n'est pas traitée ici.
kind: ConfigMap
apiVersion: v1
metadata:
  name: chart-museum
  namespace: demo
data:
  DEBUG: 'true'
  STORAGE: local
  STORAGE_LOCAL_ROOTDIR: "/charts"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: chart-museum
  namespace: demo
spec:
  selector:
    matchLabels:
      app: chart-museum
  replicas: 1
  template:
    metadata:
      labels:
        app: chart-museum
    spec:
      volumes:
        - name: pvc-charts
          persistentVolumeClaim:
              claimName: pvc-charts
      containers:
        - name: chart-museum
          image: somerepo/chartmuseum:0.0.0
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          envFrom:
            - configMapRef:
                name: chart-museum
          volumeMounts:
            - mountPath: "/charts"
              name: pvc-charts
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
      imagePullSecrets:
        - name: us.icr.io.secret
---              
apiVersion: v1
kind: Service
metadata:
  labels:
    app: chart-museum
  name: chart-museum
  namespace: demo
spec:
  type: ClusterIP
  ports:
    - name: 8080-tcp
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: chart-museum
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: chart-museum
  name: chart-museum
  namespace: demo
spec:
  port:
    targetPort: 8080-tcp
  tls:
    insecureEdgeTerminationPolicy: Redirect
    termination: edge
  to:
    kind: Service
    name: chart-museum

Le manifeste crée un objet ConfigMap et utilise un PersistentVolumeClaim pour «répliquer» la commande pour exécuter Chart Museum localement (comme décrit sur https://chartmuseum.com/ )

FROM alpine:3.10.3
RUN apk add --no-cache cifs-utils ca-certificates \
    && adduser -D -u 1000 chartmuseum
COPY chartmuseum /chartmuseum
RUN chown chartmuseum:chartmuseum /chartmuseum
RUN chown chartmuseum:chartmuseum /charts
USER chartmuseum
ENTRYPOINT ["/chartmuseum"]

Le Service et la Route du manifeste exposent le dépôt au monde externe.

  1. Une fois les objets créés, entrez la valeur HOST / PORT dans oc get route / chart-museum -n demo avec https dans barre d'adresse et appuyez sur Entrée. Vous devriez voir une page d'accueil pour Chart Museum. Cela signifie que l'installation est réussie.


0 commentaires