ผู้ใช้ในนักเทียบท่า

อันเดรย์ โคปิลอฟCTO ของเรารัก ใช้งานอย่างแข็งขัน และส่งเสริม Docker ในบทความใหม่ เขาอธิบายวิธีสร้างผู้ใช้ใน Docker ทำงานร่วมกับพวกเขาให้ถูกต้อง เหตุใดผู้ใช้จึงไม่ควรเหลือสิทธิ์รูท และวิธีแก้ไขปัญหาตัวบ่งชี้ที่ไม่ตรงกันใน Dockerfile

กระบวนการทั้งหมดในคอนเทนเนอร์จะทำงานในฐานะผู้ใช้รูท เว้นแต่คุณจะระบุด้วยวิธีพิเศษ ดูเหมือนว่าจะสะดวกมาก เพราะผู้ใช้รายนี้ไม่มีข้อจำกัด นี่คือเหตุผลว่าทำไมการทำงานในฐานะรูทจึงผิดจากมุมมองด้านความปลอดภัย หากไม่มีใครมีสติที่ถูกต้องทำงานบนเครื่องคอมพิวเตอร์ที่มีสิทธิ์รูท แสดงว่ากระบวนการต่างๆ มากมายรันภายใต้รูทในคอนเทนเนอร์

มีข้อบกพร่องอยู่เสมอที่จะทำให้มัลแวร์หลบหนีจากคอนเทนเนอร์และเข้าสู่คอมพิวเตอร์โฮสต์ได้ สมมติว่าแย่ที่สุด เราต้องแน่ใจว่ากระบวนการภายในคอนเทนเนอร์นั้นรันโดยผู้ใช้ที่ไม่มีสิทธิ์ใด ๆ บนเครื่องโฮสต์

การสร้างผู้ใช้

การสร้างผู้ใช้ในคอนเทนเนอร์ก็ไม่ต่างจากการสร้างผู้ใช้ในลีนุกซ์ อย่างไรก็ตาม คำสั่งอาจแตกต่างกันไปตามอิมเมจพื้นฐานที่แตกต่างกัน

สำหรับการแจกแจงแบบเดเบียน คุณต้องเพิ่มสิ่งต่อไปนี้ใน 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

การส่ง ID ผู้ใช้ภายในคอนเทนเนอร์เมื่อสร้างอิมเมจ

หาก ID ของคุณและ ID ของทุกคนที่ทำงานในโครงการตรงกัน ให้ระบุ ID นี้ใน Dockerfile อย่างไรก็ตาม ID ผู้ใช้มักไม่ตรงกัน

วิธีบรรลุสิ่งที่คุณต้องการไม่ชัดเจนในทันที สำหรับฉัน นี่เป็นสิ่งที่ยากที่สุดในกระบวนการเชี่ยวชาญ Docker ผู้ใช้นักเทียบท่าจำนวนมากไม่ทราบว่าชีวิตของรูปภาพมีขั้นตอนที่แตกต่างกัน ขั้นแรก รูปภาพจะถูกประกอบโดยใช้ Dockerfile เมื่อเรียกใช้คอนเทนเนอร์จากรูปภาพ Dockerfile จะไม่ถูกใช้อีกต่อไป

การสร้างผู้ใช้จะต้องเกิดขึ้นเมื่อสร้างอิมเมจ เช่นเดียวกับการกำหนดผู้ใช้ที่กระบวนการถูกเรียกใช้งาน ซึ่งหมายความว่าเราต้องส่ง UID (GID) ภายในคอนเทนเนอร์ด้วยวิธีใดวิธีหนึ่ง

คำสั่งใช้เพื่อใช้ตัวแปรภายนอกใน Dockerfile ENV и หาเรื่อง. การเปรียบเทียบคำสั่งโดยละเอียด ที่นี่.

ไฟล์นักเทียบท่า

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

คุณสามารถส่งผ่านข้อโต้แย้งผ่าน docker-compose ดังนี้:

นักเทียบท่า-เขียน

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

ป.ล. หากต้องการเชี่ยวชาญความซับซ้อนทั้งหมดของ Docker การอ่านเอกสารหรือบทความนั้นไม่เพียงพอ คุณต้องฝึกฝนให้มาก คุณต้องเข้าใจ Docker ด้วย

ที่มา: will.com

เพิ่มความคิดเห็น