สร้างแชร์โฟลเดอร์กลางด้วย Samba บน CentOS 7

หลังจากติดตั้งและคอนฟิกเซิร์ฟเวอร์แชร์ไฟล์ด้วย Samba บน CentOS 7  ซึ่งเราได้สร้างแชร์ไฟล์ให้ผู้ใช้แต่ละคนสามารถเก็บไฟล์ในโฟลเดอร์ส่วนตัว (home) บนเซิร์ฟเวอร์ได้แล้ว

ในตอนนี้ลองมาดูการคอนฟิกสร้างแชร์ไฟล์ตรงกลาง เพื่อให้ผู้ใช้หลายคนสามารถเก็บไฟล์ร่วมกันได้

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

เช่นเดิมลองมาดูวิธีการคอนฟิกทีละขั้นตอน เพื่อให้เข้าใจกระบวนการ และสามารถนำไปต่อยอดได้

สร้างผู้ใช้ (user) เพิ่มเติมสำหรับการทดสอบ

[root@cent7 ~]# useradd -g users bob
[root@cent7 ~]# useradd -g users chris

ออปชัน -g คือระบุให้ชื่อผู้ใช้ที่เพิ่มอยู่ในกลุ่มที่ต้องการ หากไม่ได้ระบุออปชันนี้ จะมีการสร้างชื่อกลุ่มขึ้นมาใหม่ ตามชื่อผู้ใช้ที่เพิ่ม

แล้วใช้คำสั่ง pdbedit เพื่อสร้างและตั้งรหัสผ่านให้แต่ละคนใน samba

[root@cent7 ~]# pdbedit -a -u bob
[root@cent7 ~]# pdbedit -a -u chris

หมายเหตุ

  • ต้องสร้างชื่อผู้ใช้ในระบบด้วย useradd ก่อน ถึงจะสร้างใน samba ได้
  • รหัสผ่านของผู้ใช้สำหรับการล็อกอินเข้าระบบ (ssh) ไม่จำเป็นต้องเหมือนกับรหัสผ่านที่เข้าแชร์ไฟล์ผ่าน samba

สรุปตอนนี้เครื่องเซิร์ฟเวอร์ที่ใช้ทดสอบนี้มีผู้ใช้ 3 คน คือ alice, bob, chris โดย bob และ chris อยู่ในกลุ่ม users แต่ alice ไม่ได้อยู่

[root@cent7 ~]# id alice
uid=1000(alice) gid=1000(alice) groups=1000(alice),10(wheel)
[root@cent7 ~]# id bob
uid=1001(bob) gid=100(users) groups=100(users)
[root@cent7 ~]# id chris
uid=1002(chris) gid=100(users) groups=100(users)

สร้างไดเรกทอรีสำหรับเก็บโฟลเดอร์แชร์ส่วนกลาง

ตัวอย่างการสร้างไดเรกทอรี /home/public แล้วใช้คำสั่ง chgrp และ chmod เพื่อให้ผู้ใช้ที่อยู่ในกลุ่ม users สามารถอ่านเขียนไฟล์ในนี้ได้

[root@cent7 ~]# mkdir /home/public
[root@cent7 ~]# chgrp users /home/public
[root@cent7 ~]# chmod 775 /home/public
[root@cent7 ~]# ls -ld /home/public
drwxrwxr-x. 2 root users 6 Aug 22 09:42 /home/public

เพื่อให้แน่ใจว่าเราสร้างและกำหนดสิทธิ์ถูกต้อง แนะนำให้ล็อกอิน (ssh) ด้วยผู้ใช้สักคนเช่น bob แล้วลองสร้างไฟล์หรือไดเรกทอรีในนี้ดู

[bob@cent7 ~]$ id
uid=1001(bob) gid=100(users) groups=100(users) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[bob@cent7 ~]$ cd /home/public/
[bob@cent7 public]$ mkdir test-by-bob
[bob@cent7 public]$ ls -l
total 0
drwxr-xr-x. 2 bob users 6 Aug 22 09:43 test-by-bob

แก้ไขไฟล์คอนฟิกของ samba เพิ่มคอนฟิกการแชร์ไดเรกทอรี /home/public ไว้เป็นชื่อแชร์โฟลเดอร์ public

[root@cent7 ~]# vi /etc/samba/smb.conf
...
[public]
comment = Public Folder
path = /home/public
writable = yes
printable = no
write list = @users

ใช้ออปชัน write list เพื่อกำหนดสิทธิ์การเขียนไฟล์ โดยอาจกำหนดเป็นรายคน หรือกำหนดเป็นรายกลุ่ม (group) โดยใช้เครื่องหมาย @ นำหน้าชื่อกลุ่ม

หลังการแก้ไขคอนฟิก (ส่วนใหญ่) ในไฟล์ smb.conf ไม่จำเป็นต้องรีสตาร์ตเซอร์วิส smb คอนฟิกที่แก้ไขมีผลเลย

ใช้คำสั่ง smbclient -L เพื่อดูข้อมูลของเซิร์ฟเวอร์แชร์ไฟล์

[root@cent7 ~]# smbclient -L localhost
Enter root's password:
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]

   Sharename    Type    Comment
   ---------    ----    -------
   public       Disk    Public Folder
   IPC$         IPC     IPC Service (Samba Server Version 4.1.12)
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]

   Server               Comment
   ---------            -------

   Workgroup            Master
   ---------            -------

ไม่จำเป็นต้องใส่ root’s password ให้กดปุ่ม [Enter] ผ่านไปเลย จะเป็นการตรวจสอบข้อมูลเซิร์ฟเวอร์แบบ anonymous

ถ้าคอนฟิกถูกต้อง จะเห็นแชร์โฟลเดอร์ public เพิ่มขึ้นมา

ขั้นต่อไปใช้ smbclient ทดสอบการเข้าแชร์โฟลเดอร์ public ด้วยชื่อผู้ใช้ bob

[root@cent7 ~]# smbclient '\\localhost\public' -U bob
Enter bob's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> dir
  .                           D        0  Sat Aug 22 09:43:07 2015
  ..                          D        0  Sat Aug 22 09:42:27 2015
  test-by-bob                 D        0  Sat Aug 22 09:43:07 2015

       35582 blocks of size 1048576. 33973 blocks available
smb: \>

ลองสร้างใช้คำสั่ง mkdir ใน smb: \> เพื่อสร้างไดเรกทอรีใหม่

smb: \> mkdir test-2
NT_STATUS_ACCESS_DENIED making remote directory \test-2
smb: \>

ผลปรากฎว่า ไม่สามารถสร้างผ่าน smb: \> ได้ ทั้งๆ ที่เราสร้างผ่านคำสั่งลีนุกซ์ได้

เช่นเดิม สาเหตุหนึ่งเกิดจาก SELinux ขอตัดคำอธิบายจากไฟล์ smb.conf

[root@cent7 ~]# vi /etc/samba/smb.conf
...
# If you create a new directory, such as a new top-level directory, label it
# with samba_share_t so that SELinux allows Samba to read and write to it. Do
# not label system directories, such as /etc/ and /home/, with samba_share_t, as
# such directories should already have an SELinux label.
#
# Run the "ls -ldZ /path/to/directory" command to view the current SELinux
# label for a given directory.
#
# Set SELinux labels only on files and directories you have created. Use the
# chcon command to temporarily change a label:
# chcon -t samba_share_t /path/to/directory

ถ้าต้องการแชร์ไฟล์ในไดเรกทอรี ผ่าน samba ต้องใช้คำสั่ง chcon เพื่อเปลี่ยน type (Security Context) ให้เป็น samba_share_t

[root@cent7 ~]# ls -ldZ /home/public
drwxrwxr-x. root users unconfined_u:object_r:home_root_t:s0 /home/public
[root@cent7 ~]# chcon -t samba_share_t /home/public
[root@cent7 ~]# ls -ldZ /home/public
drwxrwxr-x. root users unconfined_u:object_r:samba_share_t:s0 /home/public

คำแนะนำ อย่าเพิ่งเบื่อ SELinux จนกระทั่งปิดคุณสมบัตินี้กันนะครับ ส่วนใหญ่จะมีวีธีการแก้ไขอยู่แล้ว

หลังแก้ไขแล้ว ลองสร้างไดเรกทอรีผ่าน smb: \> อีกครั้ง

[root@cent7 ~]# smbclient '\\localhost\public' -U bob
Enter bob's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> mkdir test-2
smb: \> dir
  .                           D        0  Sat Aug 22 10:07:36 2015
  ..                          D        0  Sat Aug 22 09:42:27 2015
  test-by-bob                 D        0  Sat Aug 22 09:43:07 2015
  test-2                      D        0  Sat Aug 22 10:07:36 2015

       35582 blocks of size 1048576. 33974 blocks available
smb: \>

ใช้คำสั่ง ls -l ดูผลลัพธ์ที่สร้างได้

[root@cent7 ~]# ls -l /home/public/
total 0
drwxr-xr-x. 2 bob users 6 Aug 22 10:07 test-2
drwxr-xr-x. 2 bob users 6 Aug 22 09:43 test-by-bob

คอนฟิก directory mask ตั้งค่า permission ของไดเรกทอรีที่สร้างขึ้น

ทีนี้ปัญหาต่อมาก็คือ เมื่อผู้ใช้สร้างไฟล์หรือไดเรกทอรีแล้ว สิทธิ์ (permission) ในการเขียนหรือแก้ไขไฟล์จะเป็นเฉพาะผู้ใช้คนที่สร้างอย่างเดียว คนอื่นในกลุ่ม (group) อ่านได้อย่างเดียว

ถ้าต้องการให้หลังจากสร้างไดเรกทอรีแล้วให้ผู้ใช้อื่นๆ ในกลุ่ม users เดียวกัน สามารถเขียนหรือแก้ไขไฟล์ในนี้ได้ด้วย ต้องเพิ่มออปชัน directory mask

คอนฟิกออปชัน directory mask ใช้ในการคำนวณ permission ของไดเรกทอรีที่ถูกสร้างขึ้นผ่าน smb ดีฟอลต์เท่ากับ 0755 หมายความว่า ไม่อนุญาตให้กลุ่ม (group) และผู้ใช้อื่นๆ (other) สามารถเขียนหรือแก้ไขไฟล์ (write) ในนี้ได้ ถ้าจะมองง่ายๆ ก็คือสนใจตัวเลข 3 ตัวหลัง เหมือนกับค่า permission ของไฟล์บนลีนุกซ์

รายละเอียดสามารถหาอ่านได้ใน man smb.conf

ตัวอย่างการเพิ่มออปชัน directory mask ให้ไดเรกทอรีที่สร้างขึ้นมี permission เป็น 0770 คือให้ผู้ใช้ในกลุ่ม (group) สามารถเขียนได้ (ตัวเลข 7 ตัวที่ 3) แต่ไม่ให้ผู้ใช้อื่นๆ (other) เข้ามาในนี้ได้ (ตัวเลข 0 ตัวสุดท้าย)

[root@cent7 ~]# vi /etc/samba/smb.conf
...
[public]
comment = Public Folder
path = /home/public
writable = yes
printable = no
write list = @users
directory mask = 0770

ลองสร้างไดเรกทอรีผ่าน smb อีกครั้ง

[root@cent7 ~]# smbclient '\\localhost\public' -U bob
Enter bob's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> mkdir test-3
smb: \> dir
  .                           D        0  Sat Aug 22 10:49:28 2015
  ..                          D        0  Sat Aug 22 09:42:27 2015
  test-by-bob                 D        0  Sat Aug 22 09:43:07 2015
  test-2                      D        0  Sat Aug 22 10:07:36 2015
  test-3                      D        0  Sat Aug 22 10:49:28 2015

       35582 blocks of size 1048576. 33974 blocks available

สังเกตค่า permission ของไดเรกทอรีที่สร้าง

[root@cent7 ~]# ls -l /home/public/
total 0
drwxr-xr-x. 2 bob users 6 Aug 22 10:07 test-2
drwxrwx---. 2 bob users 6 Aug 22 10:49 test-3
drwxr-xr-x. 2 bob users 6 Aug 22 09:43 test-by-bob

ลองสลับเข้า smbclient ด้วยผู้ใช้อีกคน (chris)

[root@cent7 ~]# smbclient '\\localhost\public' -U chris
Enter chris's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> dir
  .                           D        0  Sat Aug 22 10:49:28 2015
  ..                          D        0  Sat Aug 22 09:42:27 2015
  test-by-bob                 D        0  Sat Aug 22 09:43:07 2015
  test-2                      D        0  Sat Aug 22 10:07:36 2015
  test-3                      D        0  Sat Aug 22 10:49:28 2015

       35582 blocks of size 1048576. 33974 blocks available
smb: \> cd test-3
smb: \test-3\> mkdir sub-dir-4
smb: \test-3\> quit

[root@cent7 ~]# ls -l /home/public/test-3
total 0
drwxrwx---. 2 chris users 6 Aug 22 10:50 sub-dir-4

คอนฟิก create mask ตั้งค่า permission ของไฟล์ที่สร้างขึ้น

ลองมาทดสอบการอัปโหลดไฟล์ผ่าน smb กันบ้าง โดยไฟล์ที่จะใช้ทดสอบคือ file-1.txt

[root@cent7 ~]# ls -l file-1.txt
-rw-r--r--. 1 root root 11630 Aug 22 10:53 file-1.txt

ใช้คำสั่ง put ใน smbclient เพื่ออัปโหลดไฟล์เข้าเซิร์ฟเวอร์แชร์ไฟล์

[root@cent7 ~]# smbclient '\\localhost\public' -U bob
Enter bob's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> put file-1.txt
putting file file-1.txt as \file-1.txt (11356.3 kb/s) (average 11357.4 kb/s)
smb: \> dir
  .                           D        0  Sat Aug 22 10:54:23 2015
  ..                          D        0  Sat Aug 22 09:42:27 2015
  test-by-bob                 D        0  Sat Aug 22 09:43:07 2015
  test-2                      D        0  Sat Aug 22 10:07:36 2015
  test-3                      D        0  Sat Aug 22 10:50:48 2015
  file-1.txt                  A    11630  Sat Aug 22 10:54:23 2015

       35582 blocks of size 1048576. 33974 blocks available
smb: \>

ลองใช้คำสั่ง ls -l เพื่อดูไฟล์ที่สร้างขึ้น สังเกตว่าค่า permission จะเป็น 744

[root@cent7 ~]# ls -l /home/public/
total 12
-rwxr--r--. 1 bob users 11630 Aug 22 10:54 file-1.txt
drwxr-xr-x. 2 bob users     6 Aug 22 10:07 test-2
drwxrwx---. 3 bob users    22 Aug 22 10:50 test-3
drwxr-xr-x. 2 bob users     6 Aug 22 09:43 test-by-bob

เช่นเดียวกัน ถ้าต้องการแก้ไขให้ผู้ใช้ในกลุ่ม users สามารถอ่านเขียนไฟล์ที่อัปโหลดผ่าน smb นี้ได้ด้วย ต้องแก้ไขค่าคอนฟิกออปชัน create mask

ค่าคอนฟิกออปชัน create mask จะใช้ในการคำนวณ permission ของไฟล์ที่ถูกสร้างขึ้น ผ่าน smb ดีฟอลต์เท่ากับ 0755 หมายความว่า ไม่อนุญาตให้กลุ่ม (group) และผู้ใช้อื่นๆ (other) สามารถเขียนหรือแก้ไขไฟล์ (write) นี้ได้

ตัวอย่างการเพิ่มออปชัน create mask ให้ไฟล์ที่สร้างขึ้นผ่าน smb มี permission เป็น 0660 คือให้ผู้ใช้ในกลุ่ม (group) สามารถเขียนหรือแก้ไขได้ (ตัวเลข 6 ตัวที่ 3) แต่ไม่ให้ผู้ใช้อื่นๆ (other) อ่านหรือเขียนไฟล์ได้ (ตัวเลข 0 ตัวสุดท้าย)

[root@cent7 ~]# vi /etc/samba/smb.conf
...
[public]
comment = Public Folder
path = /home/public
writable = yes
printable = no
write list = @users
directory mask = 0770
create mask = 0660

หมายเหตุ ความเห็นส่วนตัว ไฟล์ทั่วไปเช่นไฟล์เอกสาร รูปภาพ ที่อัปโหลดขึ้นแชร์ไฟล์เซิร์ฟเวอร์  ค่า permission เป็น 6 (rw-) คือให้อ่านและเขียนได้ก็น่าจะเพียงพอแล้ว แต่ถ้าคุณมีความจำเป็นให้ไฟล์นั้นสามารถรัน (execute) ได้ด้วย เช่นสำหรับโปรแกรมเมอร์ ก็ต้องแก้ไขค่า create mask เป็น 0770

ลองอัปโหลดอีกครั้ง

[root@cent7 ~]# smbclient '\\localhost\public' -U bob
Enter bob's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> put file-1.txt
putting file file-1.txt as \file-1.txt (11356.3 kb/s) (average 11357.4 kb/s)

สังเกต permission ของไฟล์ที่ได้

[root@cent7 ~]# ls -l /home/public/
total 12
-rw-rw----. 1 bob users 11630 Aug 22 11:09 file-1.txt
drwxr-xr-x. 2 bob users     6 Aug 22 10:07 test-2
drwxrwx---. 3 bob users    22 Aug 22 10:50 test-3
drwxr-xr-x. 2 bob users     6 Aug 22 09:43 test-by-bob

ทดสอบด้วยผู้ใช้ที่ไม่มีสิทธิ์

ทดสอบด้วยชื่อผู้ใช้ alice ที่ไม่ได้อยู่ในกลุ่ม users

[root@cent7 ~]# smbclient '\\localhost\public' -U alice
Enter alice's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
smb: \> dir
  .                           D        0  Sat Aug 22 10:54:23 2015
  ..                          D        0  Sat Aug 22 09:42:27 2015
  test-by-bob                 D        0  Sat Aug 22 09:43:07 2015
  test-2                      D        0  Sat Aug 22 10:07:36 2015
  test-3                      D        0  Sat Aug 22 10:50:48 2015
  file-1.txt                  A    11630  Sat Aug 22 10:54:23 2015

       35582 blocks of size 1048576. 33974 blocks available

smb: \> mkdir test-by-alice
NT_STATUS_ACCESS_DENIED making remote directory \test-by-alice
smb: \> cd test-3
smb: \test-3\> dir
NT_STATUS_ACCESS_DENIED listing \test-3\*
smb: \test-3\> cd ..
smb: \> get file-1.txt
NT_STATUS_ACCESS_DENIED opening remote file \file-1.txt
smb: \>

ไม่สามารถสร้างไดเรกทอรี หรือเข้าไฟล์หรือไดเรกทอรีที่ผู้ใช้ในกลุ่ม users สร้างไว้

และเพื่อเพิ่มความปลอดภัย ถ้าไม่ต้องการให้ผู้ใช้ที่ไม่อยู่ในกลุ่ม users เข้าไปในแชร์โฟลเดอร์นี้ได้เลย ก็สามารถแก้ไขไฟล์คอนฟิก smb.conf เพิ่มเติม ด้วยการกำหนดผู้ใช้ที่มีสิทธิ์ (valid users)

ตัวอย่างการเพิ่มออปชัน valid users เพื่อระบุชื่อผู้ใช้ หรือชื่อกลุ่ม @users ที่มีสิทธิ์เข้าแชร์โฟลเดอร์นี้ได้

[root@cent7 ~]# vi /etc/samba/smb.conf
...
[public]
comment = Public Folder
path = /home/public
writable = yes
printable = no
write list = @users
directory mask = 0770
create mask = 0660
valid users = @users

ลองใช้ smbclient ด้วยชื่อผู้ใช้ alice อีกครั้ง

[root@cent7 ~]# smbclient '\\localhost\public' -U alice
Enter alice's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
tree connect failed: NT_STATUS_ACCESS_DENIED

ก็จะไม่สามารถเข้าแชร์โฟลเดอร์ public ได้แล้ว เพราะ alice ไม่ได้อยู่ในกลุ่ม users

หลังจากทดสอบผ่าน smbclient เป็นที่เรียบร้อยแล้ว อย่าลืมทดสอบการเข้าเซิร์ฟเวอร์แชร์ไฟล์ Windows หรือ Mac OS X ด้วยนะครับ ก่อนนำไปใช้งานจริง

ข้อมูลอ้างอิง

Leave a Reply