กระบวนการทั้งหมดในคอนเทนเนอร์จะทำงานในฐานะผู้ใช้รูท เว้นแต่คุณจะระบุด้วยวิธีพิเศษ ดูเหมือนว่าจะสะดวกมาก เพราะผู้ใช้รายนี้ไม่มีข้อจำกัด นี่คือเหตุผลว่าทำไมการทำงานในฐานะรูทจึงผิดจากมุมมองด้านความปลอดภัย หากไม่มีใครมีสติที่ถูกต้องทำงานบนเครื่องคอมพิวเตอร์ที่มีสิทธิ์รูท แสดงว่ากระบวนการต่างๆ มากมายรันภายใต้รูทในคอนเทนเนอร์
มีข้อบกพร่องอยู่เสมอที่จะทำให้มัลแวร์หลบหนีจากคอนเทนเนอร์และเข้าสู่คอมพิวเตอร์โฮสต์ได้ สมมติว่าแย่ที่สุด เราต้องแน่ใจว่ากระบวนการภายในคอนเทนเนอร์นั้นรันโดยผู้ใช้ที่ไม่มีสิทธิ์ใด ๆ บนเครื่องโฮสต์
การสร้างผู้ใช้
การสร้างผู้ใช้ในคอนเทนเนอร์ก็ไม่ต่างจากการสร้างผู้ใช้ในลีนุกซ์ อย่างไรก็ตาม คำสั่งอาจแตกต่างกันไปตามอิมเมจพื้นฐานที่แตกต่างกัน
สำหรับการแจกแจงแบบเดเบียน คุณต้องเพิ่มสิ่งต่อไปนี้ใน 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
ไฟล์นักเทียบท่า
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