Χρήστης στο Docker

Αντρέι Κοπίλοφ, ο CTO μας, αγαπά, χρησιμοποιεί και προωθεί ενεργά το Docker. Σε ένα νέο άρθρο, εξηγεί πώς να δημιουργήσετε χρήστες στο Docker. Σωστή εργασία μαζί τους, γιατί οι χρήστες δεν πρέπει να έχουν δικαιώματα ρίζας και πώς να λύσουν το πρόβλημα των αναντιστοιχιών δεικτών στο Dockerfile.

Όλες οι διεργασίες στο κοντέινερ θα εκτελούνται ως χρήστης ρίζας, εκτός εάν το καθορίσετε με ειδικό τρόπο. Αυτό φαίνεται πολύ βολικό, επειδή αυτός ο χρήστης δεν έχει περιορισμούς. Αυτός είναι ο λόγος για τον οποίο η εργασία ως root είναι λάθος από άποψη ασφάλειας. Εάν κανένας με το σωστό μυαλό του δεν δουλεύει στον τοπικό υπολογιστή με δικαιώματα root, τότε πολλές εκτελούν διεργασίες κάτω από το root σε κοντέινερ.

Υπάρχουν πάντα σφάλματα που επιτρέπουν στο κακόβουλο λογισμικό να διαφύγει από το κοντέινερ και να εισέλθει στον κεντρικό υπολογιστή. Υποθέτοντας το χειρότερο, πρέπει να διασφαλίσουμε ότι οι διεργασίες μέσα στο κοντέινερ εκτελούνται από έναν χρήστη που δεν έχει δικαιώματα στον κεντρικό υπολογιστή.

Δημιουργία χρήστη

Η δημιουργία ενός χρήστη σε ένα κοντέινερ δεν διαφέρει από τη δημιουργία του σε διανομές Linux. Ωστόσο, οι εντολές ενδέχεται να διαφέρουν για διαφορετικές εικόνες βάσης.

Για διανομές που βασίζονται σε debian, πρέπει να προσθέσετε τα ακόλουθα στο Dockerfile:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

Για αλπικά:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

Εκτέλεση διαδικασιών από τον χρήστη

Για να εκτελέσετε όλες τις επόμενες διεργασίες ως χρήστης με UID 2000, εκτελέστε:

USER 2000

Για να εκτελέσετε όλες τις επόμενες διεργασίες ως χρήστης του κόμβου, εκτελέστε:

USER node

Περισσότερα στο τεκμηρίωση.

Όγκοι τοποθέτησης

Όταν τοποθετείτε τόμους μέσα σε ένα κοντέινερ, παρέχετε στον χρήστη τη δυνατότητα ανάγνωσης και/ή εγγραφής αρχείων. Για να γίνει αυτό, το UID (GID) του χρήστη στο κοντέινερ και του χρήστη εκτός του κοντέινερ που έχει τα κατάλληλα δικαιώματα πρόσβασης στο αρχείο πρέπει να ταιριάζει. Σε αυτήν την περίπτωση, τα ονόματα χρήστη δεν έχουν σημασία.

Συχνά σε έναν υπολογιστή Linux, το UID και το GID ενός χρήστη είναι ίσα με 1000. Αυτά τα αναγνωριστικά εκχωρούνται στον πρώτο χρήστη του υπολογιστή.

Η εύρεση των αναγνωριστικών σας είναι εύκολη:

id

Θα λάβετε ολοκληρωμένες πληροφορίες για τον χρήστη σας.
Αντικαταστήστε το 2000 από τα παραδείγματα με το αναγνωριστικό σας και όλα θα πάνε καλά.

Εκχώρηση UID και GID σε έναν χρήστη

Εάν ο χρήστης δημιουργήθηκε προηγουμένως, αλλά πρέπει να αλλάξετε τα αναγνωριστικά, μπορείτε να το κάνετε ως εξής:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Εάν χρησιμοποιείτε την εικόνα αλπικής βάσης, πρέπει να εγκαταστήσετε το πακέτο σκιών:

RUN apk add —no-cache shadow

Διαβίβαση του αναγνωριστικού χρήστη μέσα στο κοντέινερ κατά τη δημιουργία της εικόνας

Εάν το αναγνωριστικό σας και τα αναγνωριστικά όλων των ατόμων που εργάζονται στο έργο ταιριάζουν, τότε απλώς καθορίστε αυτό το αναγνωριστικό στο αρχείο Docker. Ωστόσο, συχνά τα αναγνωριστικά χρήστη δεν ταιριάζουν.

Το πώς να πετύχετε αυτό που θέλετε δεν είναι αμέσως σαφές. Για μένα, αυτό ήταν το πιο δύσκολο πράγμα στη διαδικασία του mastering Docker. Πολλοί χρήστες docker δεν συνειδητοποιούν ότι υπάρχουν διαφορετικά στάδια στη ζωή μιας εικόνας. Αρχικά, η εικόνα συναρμολογείται χρησιμοποιώντας ένα αρχείο Docker. Κατά την εκτέλεση ενός κοντέινερ από μια εικόνα, το αρχείο Docker δεν χρησιμοποιείται πλέον.

Η δημιουργία χρήστη πρέπει να πραγματοποιείται κατά τη δημιουργία της εικόνας. Το ίδιο ισχύει για τον προσδιορισμό του χρήστη υπό τον οποίο εκκινούνται οι διαδικασίες. Αυτό σημαίνει ότι πρέπει με κάποιο τρόπο να περάσουμε το UID (GID) μέσα στο κοντέινερ.

Οι οδηγίες χρησιμοποιούνται για τη χρήση εξωτερικών μεταβλητών στο Dockerfile ENV и ARG. Λεπτομερής σύγκριση οδηγιών εδώ.

Dockerfile

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

Μπορείτε να περάσετε ορίσματα μέσω του docker-compose ως εξής:

docker-compose

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

ΥΓ Για να κατακτήσετε όλες τις περιπλοκές του Docker, δεν αρκεί να διαβάσετε την τεκμηρίωση ή τα άρθρα. Πρέπει να εξασκηθείτε πολύ, πρέπει να πάρετε μια αίσθηση για τον Docker.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο