เครื่อง Linux หนึ่งเครื่องมีคนใช้หลายคนได้ในเวลาเดียวกัน — บทนี้จะสอนวิธีสร้างผู้ใช้ ตั้งรหัสผ่าน จัดเข้ากลุ่ม และคุมว่าใครทำอะไรได้บ้าง ซึ่งเป็นหัวข้อที่ออกสอบ RHCSA แทบทุกครั้ง
🌱 บทนี้เขียนเพื่อคนที่ไม่เคยแตะ Linux มาก่อนเลยถ้าเคยใช้คอมส่วนตัวที่บ้าน คุณอาจชินกับการมีแค่ user เดียว — เปิดเครื่องมาก็ใช้ได้เลย แต่เครื่อง Linux โดยเฉพาะเซิร์ฟเวอร์ มักมี คนใช้พร้อมกันหลายคน เช่น ทีมงาน นักพัฒนา หรือโปรแกรมต่างๆ ที่รันอยู่เบื้องหลัง
การแยกผู้ใช้ออกจากกันให้ประโยชน์ 3 อย่าง:
/home ไว้เก็บไฟล์นึกถึง หอพักนักศึกษา ตึกหนึ่ง:
• แต่ละคนมี ห้องของตัวเอง (= home directory ใน /home)
• แต่ละคนมี กุญแจของตัวเอง (= รหัสผ่าน) เข้าได้แค่ห้องตัวเอง
• มี ผู้จัดการหอ ที่ถือกุญแจมาสเตอร์เข้าได้ทุกห้อง (= root)
• มี กลุ่ม เช่น “ชั้น 3 ใช้ห้องซักผ้าร่วมกันได้” (= group สิทธิ์ที่ใช้ร่วมกัน)
คุณจะไม่อยากให้ทุกคนในหอถือกุญแจมาสเตอร์ใช่ไหม? นั่นแหละเหตุผลที่เราแยก user และให้สิทธิ์ root เฉพาะคนที่จำเป็นจริงๆ
การจัดการ user/group เป็นงานพื้นฐานที่ผู้ดูแลระบบทำทุกวัน ข้อสอบ RHCSA จึงมักให้ “สร้าง user ชื่อนี้ ใส่กลุ่มนี้ ตั้งรหัสผ่าน กำหนดวันหมดอายุ” แล้ว reboot เครื่องไปตรวจ ว่าทำครบหรือไม่
ข้อมูล user และ group ทั้งหมด ถูกเก็บเป็นไฟล์ข้อความธรรมดา 3 ไฟล์ในเครื่อง ไม่ได้ซ่อนอยู่ในฐานข้อมูลลึกลับที่ไหน เปิดอ่านได้เลย เข้าใจ 3 ไฟล์นี้แล้วจะเข้าใจทั้งบท
ชื่ออาจชวนเข้าใจผิด แต่ไฟล์นี้ ไม่ได้เก็บรหัสผ่าน (สมัยก่อนเคยเก็บ จึงติดชื่อมา) มันเก็บข้อมูลพื้นฐานของแต่ละ user หนึ่งบรรทัดต่อหนึ่งคน คั่นแต่ละช่องด้วยเครื่องหมาย :
student:x:1000:1000:Student User:/home/student:/bin/bash
อ่านทีละช่อง (ซ้ายไปขวา) จะเห็นว่าแต่ละช่องบอกอะไร:
studentชื่อ login ของ userxตรงนี้เคยเป็นรหัสผ่าน ตอนนี้เป็นแค่ x หมายถึง “รหัสจริงไปอยู่ใน /etc/shadow แล้ว”1000UID — เลขประจำตัว user (ช่องที่ 3)1000GID — เลขกลุ่มหลัก (primary group) ของ userStudent Userคำอธิบาย/ชื่อเต็ม (comment) ใส่อะไรก็ได้/home/studenthome directory — “บ้าน” ของ user คนนี้/bin/bashshell ที่ใช้ตอนล็อกอิน (ถ้าเป็น /sbin/nologin = ห้ามล็อกอิน)นี่คือที่เก็บรหัสผ่านจริง แต่ เข้ารหัสไว้ (hash) ไม่ใช่ตัวอักษรที่อ่านออก และไฟล์นี้ เปิดอ่านได้เฉพาะ root เพื่อความปลอดภัย
student:$6$xT3z...HrK:19500:0:99999:7:::
studentชื่อ user (ตรงกับใน passwd)$6$xT3z...รหัสผ่านที่เข้ารหัสแล้ว ถ้าเห็น ! หรือ * นำหน้า = บัญชีถูกล็อก ล็อกอินไม่ได้19500วันที่เปลี่ยนรหัสครั้งล่าสุด (นับเป็นจำนวนวันตั้งแต่ 1 ม.ค. 1970)0อายุขั้นต่ำ — ต้องใช้รหัสนี้กี่วันก่อนเปลี่ยนได้ (chage -m)99999อายุสูงสุด — รหัสใช้ได้กี่วันก่อนต้องเปลี่ยน (chage -M)7เตือนล่วงหน้ากี่วันก่อนรหัสหมดอายุ (chage -W)คุณไม่ต้องแก้ไฟล์นี้ด้วยมือ! เดี๋ยวข้อ 8 จะใช้คำสั่ง chage จัดการตัวเลขเหล่านี้ให้แบบไม่ต้องนับวันเอง — แค่รู้ว่าตัวเลขแต่ละช่องคืออะไรก็พอ
เก็บว่ามีกลุ่มอะไรบ้าง และใครเป็นสมาชิก
developers:x:1500:student,alice,bob
developersชื่อกลุ่มxช่องรหัสผ่านกลุ่ม (แทบไม่ได้ใช้)1500GID — เลขประจำตัวกลุ่มstudent,alice,bobรายชื่อสมาชิก (secondary members) คั่นด้วยจุลภาคเครื่องไม่ได้สนใจ “ชื่อ” user เท่าไหร่ จริงๆ มันใช้ ตัวเลข ในการอ้างถึงแต่ละคน เรียกว่า UID (User ID) เหมือนเลขบัตรประชาชน
| ช่วง UID | คือใคร |
|---|---|
0 | root เสมอ — ผู้ดูแลระบบสูงสุด UID 0 คือเจ้านายของเครื่อง |
1 – 999 | user ระบบ (system user) — ไม่ใช่คน แต่เป็นบัญชีของโปรแกรม/บริการ เช่น sshd, nginx |
1000+ | user ทั่วไป (คนจริงๆ) — บน RHEL 9 user คนแรกที่สร้างจะได้ UID 1000 คนถัดไป 1001, 1002 ... |
UID เหมือน เลขห้องในหอพัก — ห้อง 0 คือห้องผู้จัดการ (root), ห้อง 1–999 คือห้องเก็บของ/ห้องเครื่อง (โปรแกรมระบบ) ส่วนห้อง 1000 ขึ้นไปคือห้องของนักศึกษาจริงๆ (คนใช้งานทั่วไป)
ใครก็ตามที่มี UID 0 จะมีสิทธิ์เท่า root ทั้งหมด ดังนั้น อย่าตั้ง UID ของ user ทั่วไปให้เป็น 0 เด็ดขาด เพราะเท่ากับมอบกุญแจมาสเตอร์ให้
ก่อนจะไปจัดการคนอื่น เรามาดูตัวเองก่อนว่าเราเป็นใคร อยู่กลุ่มไหน มี 3 คำสั่งง่ายๆ
[student@server1 ~]$ whoami student [student@server1 ~]$ id uid=1000(student) gid=1000(student) groups=1000(student),10(wheel) [student@server1 ~]$ groups student wheel
whoamiบอกแค่ชื่อ user ที่กำลังใช้อยู่ตอนนี้idบอกละเอียด: UID, GID (กลุ่มหลัก) และ groups (กลุ่มทั้งหมดที่อยู่)groupsบอกแค่รายชื่อกลุ่มที่ user นี้เป็นสมาชิกid aliceดูข้อมูลของ user คนอื่นก็ได้ แค่ใส่ชื่อต่อท้ายในผลลัพธ์ข้างบนเห็น wheel ไหม? นั่นคือกลุ่มพิเศษที่สมาชิกใช้ sudo (ยกระดับเป็น root ชั่วคราว) ได้ จำชื่อนี้ไว้ เดี๋ยวจะเจ่อในบทเรื่องสิทธิ์
งานเหล่านี้ต้องใช้สิทธิ์ root (ขึ้นต้นด้วย sudo หรือเป็น root อยู่แล้ว) เพราะเป็นการแก้ไฟล์ระบบ
[root@server1 ~]# useradd alice [root@server1 ~]# id alice uid=1001(alice) gid=1001(alice) groups=1001(alice)
แค่ useradd alice เครื่องจะทำให้เราอัตโนมัติหลายอย่าง:
UIDให้เลขถัดไปที่ว่าง (ในตัวอย่างคือ 1001)homeสร้างโฟลเดอร์ /home/alice ให้groupสร้างกลุ่มหลักชื่อเดียวกับ user (alice) ให้shellตั้ง shell เริ่มต้นเป็น /bin/bashuser ที่เพิ่ง useradd มา ยังไม่มีรหัสผ่าน บัญชีจึงถูกล็อกอยู่ ต้องตั้งรหัสผ่านด้วย passwd ก่อนถึงจะล็อกอินได้ — ข้อนี้พลาดกันบ่อยมากในข้อสอบ!
[root@server1 ~]# passwd alice Changing password for user alice. New password: (พิมพ์รหัส — จะไม่เห็นตัวอักษรขึ้นจอ ปกติ!) Retype new password: passwd: all authentication tokens updated successfully.
passwd aliceroot ตั้งรหัสให้ user คนอื่น (ไม่ต้องรู้รหัสเก่า)passwdพิมพ์เฉยๆ = เปลี่ยนรหัส ของตัวเองเวลาพิมพ์รหัสผ่านใน Linux มันจะ ไม่แสดงดอกจันหรือตัวอักษรใดๆ เพื่อความปลอดภัย พิมพ์ไปตามปกติแล้วกด Enter ได้เลย
[root@server1 ~]# userdel alice # ลบ user แต่ บ้าน /home/alice ยังค้างอยู่! [root@server1 ~]# userdel -r bob # ลบ user พร้อมบ้าน /home/bob และเมลของเขา
userdel aliceลบบัญชีออกจากระบบ แต่ ทิ้งโฟลเดอร์บ้านไว้ (ไฟล์ของเขาจะกลายเป็นขยะค้างเครื่อง)userdel -r bobเพิ่ม -r (remove) เพื่อ ลบบ้านและไฟล์ส่วนตัวไปด้วย สะอาดกว่าถ้าโจทย์บอกว่า “ลบ user ให้หมดจด” หรือ “ลบทั้งบ้าน” ให้นึกถึง -r ทันที
คำสั่ง usermod (user modify) ใช้แก้ไขข้อมูล user ที่มีอยู่แล้ว — เปลี่ยนกลุ่ม, ล็อกบัญชี, เปลี่ยน shell ฯลฯ จุดที่ออกสอบบ่อยที่สุดคือ การเพิ่ม user เข้ากลุ่ม
[root@server1 ~]# usermod -aG developers alice [root@server1 ~]# id alice uid=1001(alice) gid=1001(alice) groups=1001(alice),1500(developers)
-G(Group) บอกว่าจะใส่เข้ากลุ่มเสริม (secondary group)-a(append) แปลว่า “เพิ่มต่อท้าย” ของเดิมที่มีอยู่ถ้าพิมพ์ usermod -G developers alice (ไม่มี -a) มันจะ แทนที่ กลุ่มเสริมทั้งหมดของ alice ด้วย developers ตัวเดียว — กลุ่มอื่นๆ ที่เธอเคยอยู่ หลุดหมด!
กฎเหล็ก: จะเพิ่มเข้ากลุ่ม ใช้ -aG เสมอ (a มาคู่ G ตลอด)
[root@server1 ~]# usermod -L alice # ล็อกบัญชี — alice ล็อกอินด้วยรหัสผ่านไม่ได้ [root@server1 ~]# usermod -U alice # ปลดล็อก — ใช้งานได้ตามเดิม
-L(Lock) ล็อกบัญชี — เบื้องหลังคือใส่ ! หน้า hash รหัสใน /etc/shadow-U(Unlock) ปลดล็อก[root@server1 ~]# usermod -s /sbin/nologin alice # เปลี่ยน shell เป็น nologin = ห้ามล็อกอินเข้า shell (แต่ใช้บริการอื่นได้) [root@server1 ~]# usermod -e 2026-12-31 alice # ตั้งวันหมดอายุของบัญชี — พ้นวันนี้แล้วบัญชีใช้ไม่ได้ [root@server1 ~]# usermod -c "Alice in Marketing" alice # ใส่คำอธิบาย/ชื่อเต็ม (comment) ลงช่องที่ 5 ของ passwd
-s(shell) เปลี่ยน login shell /sbin/nologin ใช้บ่อยกับบัญชีที่ไม่อยากให้ใครล็อกอินเข้ามา-e(expire) วันหมดอายุของ บัญชี รูปแบบ YYYY-MM-DD-c(comment) ใส่ชื่อเต็มหรือคำอธิบายusermod -e = วันที่ทั้ง บัญชี หมดอายุ (ล็อกอินไม่ได้อีกเลย) ส่วนการตั้งวันหมดอายุของ รหัสผ่าน (ต้องเปลี่ยนรหัสใหม่) ใช้ chage ในข้อถัดไป
[root@server1 ~]# groupadd developers [root@server1 ~]# groupadd -g 1600 testers # -g กำหนด GID เองได้ (ถ้าไม่ใส่ ระบบเลือกให้) [root@server1 ~]# groupdel testers # ลบกลุ่ม
groupadd ชื่อสร้างกลุ่มใหม่groupadd -g 1600 ชื่อสร้างกลุ่มพร้อมกำหนดเลข GID เองgroupdel ชื่อลบกลุ่มuser ทุกคนมีกลุ่ม 2 แบบ ฟังดูซับซ้อนแต่จริงๆ ง่ายมาก:
alice มี primary group ชื่อ alice)developers เพื่อแชร์โฟลเดอร์โปรเจกต์ร่วมกัน (ใช้ usermod -aG)กลับไปที่หอพัก: primary group = ห้องส่วนตัวของคุณ (มีห้องเดียว) ส่วน secondary group = บัตรเข้าห้องส่วนกลางต่างๆ เช่น บัตรห้องฟิตเนส บัตรห้องซักผ้า — คุณถือได้หลายใบ แต่ละใบเปิดประตูคนละบาน
ถ้าต้องการ เปลี่ยน กลุ่มหลัก ใช้ usermod -g ชื่อกลุ่ม alice (g เล็ก ไม่มี a) — ต่างจาก -aG (G ใหญ่) ที่เป็นกลุ่มเสริม
คำสั่ง chage (มาจาก “change age”) ใช้จัดการ “อายุ” ของรหัสผ่าน เช่นบังคับให้เปลี่ยนรหัสทุก 90 วัน หรือเตือนล่วงหน้า 7 วัน ตัวเลขพวกนี้คือช่องท้ายๆ ใน /etc/shadow ที่เราเห็นในข้อ 2 นั่นเอง
[root@server1 ~]# chage -l alice Last password change : Jun 16, 2026 Password expires : never Password inactive : never Account expires : never Minimum number of days ... : 0 Maximum number of days ... : 99999 Number of days of warning ... : 7
-l (list) แสดงนโยบายปัจจุบันแบบอ่านง่าย เป็นวันที่จริง ไม่ต้องนับเลขเอง
[root@server1 ~]# chage -M 90 alice # รหัสผ่านใช้ได้สูงสุด 90 วัน แล้วต้องเปลี่ยน [root@server1 ~]# chage -m 7 alice # เปลี่ยนรหัสได้อีกครั้งหลังผ่านไปอย่างน้อย 7 วัน [root@server1 ~]# chage -W 10 alice # เตือนล่วงหน้า 10 วันก่อนรหัสหมดอายุ [root@server1 ~]# chage -E 2026-12-31 alice # บัญชีหมดอายุวันที่ 31 ธ.ค. 2026
-M(Maximum, M ใหญ่) อายุสูงสุดของรหัส (วัน)-m(minimum, m เล็ก) อายุขั้นต่ำก่อนเปลี่ยนได้อีก (วัน)-W(Warning) เตือนล่วงหน้ากี่วัน-E(Expire) วันหมดอายุของบัญชี (เหมือน usermod -e)ไฟล์ /etc/login.defs เก็บ “ค่าตั้งต้น” ที่ใช้กับ user ใหม่ ทุกคน เช่น PASS_MAX_DAYS, PASS_MIN_DAYS, PASS_WARN_AGE — ถ้าโจทย์ขอให้ user ที่สร้างหลังจากนี้มีนโยบายแบบเดียวกันทั้งหมด ให้แก้ที่ไฟล์นี้ (ส่วน chage เป็นการแก้ทีละคน)
เคยสงสัยไหมว่า ทำไม user ใหม่ที่เพิ่งสร้าง บ้านของเขาถึงมีไฟล์ตั้งค่าอย่าง .bashrc มาให้แล้ว? คำตอบคือ /etc/skel
/etc/skel (มาจาก “skeleton” = โครงร่าง) เหมือน “ห้องตัวอย่างของหอพัก” ที่จัดเฟอร์นิเจอร์พื้นฐานไว้แล้ว — เตียง โต๊ะ ตู้ พอมีนักศึกษาใหม่ย้ายเข้า ผู้จัดการก็ ก๊อปปี้ของในห้องตัวอย่างไปวางในห้องใหม่ให้ ทุกคนเลยได้ของเริ่มต้นเหมือนกัน
[root@server1 ~]# ls -a /etc/skel . .. .bash_logout .bash_profile .bashrc
ทุกครั้งที่ useradd สร้าง user ใหม่ ระบบจะ ก๊อปปี้ทุกไฟล์ใน /etc/skel ไปไว้ในบ้านของ user นั้น ดังนั้นถ้าอยากให้ user ใหม่ทุกคนมีไฟล์อะไรติดตัวมาด้วย (เช่นไฟล์คู่มือต้อนรับ) ก็แค่เอาไปวางใน /etc/skel
บางครั้งเราต้องการ “สวมรอย” เป็น user คนอื่น (หรือเป็น root) ชั่วคราว เพื่อทดสอบหรือทำงานในนามเขา ใช้คำสั่ง su (substitute user)
[student@server1 ~]$ su - alice Password: [alice@server1 ~]$ pwd /home/alice ← เด้งมาที่บ้านของ alice เลย [student@server1 ~]$ su alice Password: [alice@server1 student]$ pwd /home/student ← ยังค้างอยู่ที่เดิม สภาพแวดล้อมไม่ครบ
su - aliceมี ขีด - = สลับแบบ “ล็อกอินใหม่เต็มตัว” โหลด environment, เด้งเข้าบ้านของ alice — แบบนี้คือที่เราอยากได้เกือบทุกครั้งsu aliceไม่มีขีด = สลับ user แต่ ยังใช้ environment เดิม ไม่เปลี่ยนโฟลเดอร์ มักทำให้ตัวแปร/PATH ไม่ครบsu -ไม่ใส่ชื่อ = สลับเป็น root (ต้องรู้รหัส root)exitออกจาก user ที่สวมรอย กลับเป็นตัวเองเดิม- ไว้ก่อน
เกือบทุกครั้งที่สลับ user คุณอยากได้ environment ที่ครบถ้วน ดังนั้นติดนิสัยพิมพ์ su - (มีขีด) ไว้จะปลอดภัยที่สุด
ต่างจากการตั้งค่าบางอย่างใน Linux ที่ “หายตอน reboot” — ทุกคำสั่งในบทนี้ (useradd, passwd, usermod, groupadd, chage) เขียนผลลงไฟล์ /etc/passwd, /etc/shadow, /etc/group ทันที จึงอยู่ถาวรหลัง reboot โดยอัตโนมัติ ไม่ต้องสั่ง “save” อะไรเพิ่ม
แต่ “ถาวร” ไม่ได้แปลว่า “ถูกต้อง” — ข้อสอบ RHCSA จะ reboot เครื่องแล้วเข้ามาตรวจ ว่าคุณทำ ครบ ทุกขั้นหรือเปล่า จุดที่คนทำตกหล่นบ่อย:
passwd ผู้ตรวจล็อกอินไม่ได้ = ได้ 0 คะแนน-a ทำให้ user หลุดจากกลุ่มที่ควรอยู่หลังทำเสร็จทุกครั้ง พิมพ์ id ชื่อ เพื่อยืนยัน UID/กลุ่ม และ chage -l ชื่อ เพื่อยืนยันนโยบายรหัส — ใช้เวลาไม่กี่วินาที แต่กันพลาดได้เยอะมาก
usermod -G developers alice (ไม่มี a) จะ เตะ alice ออกจากกลุ่มเสริมเดิมทั้งหมด เหลือแต่ developers — จำว่าเพิ่มกลุ่มต้องใช้ -aG เสมอuserdel alice เฉยๆ ทิ้งโฟลเดอร์ /home/alice ค้างเครื่องเป็นขยะ — ถ้าจะลบให้หมดจดใช้ userdel -ruseradd แล้วไม่ passwd ต่อ บัญชีจะถูกล็อก ล็อกอินไม่ได้ — นี่คือข้อพลาดอันดับ 1 ในข้อสอบchage ตัว -M ใหญ่คืออายุ สูงสุด ส่วน -m เล็กคืออายุ ขั้นต่ำ สลับกันคือตั้งนโยบายผิดsu - มีขีดไว้usermod -e / chage -E = หมดอายุ บัญชี ส่วน chage -M = หมดอายุ รหัสผ่าน คนละเรื่องกัน| คำสั่ง | ทำอะไร |
|---|---|
id ชื่อ | ดู UID, GID และกลุ่มของ user |
whoami | บอกชื่อ user ที่ใช้อยู่ตอนนี้ |
groups ชื่อ | ดูกลุ่มที่ user เป็นสมาชิก |
useradd ชื่อ | สร้าง user ใหม่ (พร้อมบ้าน + กลุ่มหลัก) |
passwd ชื่อ | ตั้ง/เปลี่ยนรหัสผ่าน (อย่าลืมทำหลัง useradd!) |
userdel ชื่อ | ลบ user (บ้านยังค้างอยู่) |
userdel -r ชื่อ | ลบ user พร้อมบ้าน |
usermod -aG กลุ่ม ชื่อ | เพิ่ม user เข้ากลุ่มเสริม (ต้องมี a) |
usermod -g กลุ่ม ชื่อ | เปลี่ยนกลุ่มหลัก (primary) |
usermod -L / -U ชื่อ | ล็อก / ปลดล็อกบัญชี |
usermod -s /sbin/nologin ชื่อ | เปลี่ยน shell (ห้ามล็อกอิน) |
usermod -e YYYY-MM-DD ชื่อ | ตั้งวันหมดอายุของบัญชี |
usermod -c "ข้อความ" ชื่อ | ใส่คำอธิบาย/ชื่อเต็ม |
groupadd ชื่อกลุ่ม | สร้างกลุ่มใหม่ |
groupdel ชื่อกลุ่ม | ลบกลุ่ม |
chage -l ชื่อ | ดูนโยบายอายุรหัสผ่าน |
chage -M วัน ชื่อ | อายุรหัสสูงสุด (วัน) |
chage -m วัน ชื่อ | อายุรหัสขั้นต่ำ (วัน) |
chage -W วัน ชื่อ | เตือนล่วงหน้าก่อนรหัสหมดอายุ |
chage -E YYYY-MM-DD ชื่อ | วันหมดอายุของบัญชี |
su - ชื่อ | สลับเป็น user อื่นแบบล็อกอินเต็ม |
su - | สลับเป็น root |
| ไฟล์สำคัญ | เก็บอะไร |
|---|---|
/etc/passwd | รายชื่อ user, UID, home, shell |
/etc/shadow | รหัสผ่านเข้ารหัส + นโยบายอายุรหัส (root อ่านเท่านั้น) |
/etc/group | รายชื่อกลุ่มและสมาชิก |
/etc/skel | แม่แบบไฟล์ที่ก๊อปให้ user ใหม่ทุกคน |
/etc/login.defs | ค่าเริ่มต้นของนโยบายรหัสสำหรับ user ใหม่ |
สร้าง user ใหม่ (useradd) → ตั้งรหัสผ่าน (passwd) → ใส่เข้ากลุ่มถูกต้อง (usermod -aG) → กำหนดนโยบายรหัสและวันหมดอายุ (chage) → และตรวจซ้ำด้วย id กับ chage -l ก่อน reboot ได้อย่างมั่นใจ