Pages

2/11/2012

Apache2 Server Permission on /var/www



เงื่อนไขคือถ้าไฟล์ไหนต้องให้ Apache ประมวลผลได้
จะต้องตั้ง permission ให้ user ของ Apache2 server สามารถอ่านได้ (read)
และ folder ของไฟล์นั้นจะต้องเป็นรันได้ (executable)
สรุปคือ ..  
  • file จะต้อง r-- หรือ rw-  (ถ้าต้องการให้เขียนแก้ไขได้ด้วย)
  • folder จะต้อง r-x หรือ rwx  (ถ้าต้องการให้เขียนไฟล์ใหม่ได้ด้วย)
ซึ่งโดยส่วนใหญ่ก็จะเป็นประมาณนี้ ตามเงื่อนไขนี้อยู่แล้ว
แต่ก็จะมีปัญหาต่อมาก็คือ  ถ้าเราไม่ตั้งอะไรเลย
default ของ Apache2 จะทำให้ไฟล์ทุกไฟล์ภายใต้ /var/www เป็นเจ้าของโดย www-data:www-data
(เจ้าของโดย user ชื่อ 'www-data' และโดยกลุ่มชื่อ 'www-data')
ซึ่งเป็น user ของ Apache2 หลังจากติดตั้งแบบอัตโนมัติ
Apache2's username = "www-data" และ group = "www-data"

ซึ่งพอมีเจ้าของแบบนั้นแล้ว  
เลยทำให้ web developer ผู้ที่ไม่เกี่ยวข้องอะไรกับ username หรือ group นั้นเลยเอาไฟล์ไปวางไว้ไม่ได้
ดังนั้น จึงต้องมีการจัดการ permission ของไฟล์ซะก่อน

ทางเลือกที่มีก็คือ:
1. มี web developer คนเดียว ใช้คนเดียว
Permission ที่จำเป็นคือ
-rw-r----- devuser www-data somefile
drwxr-s--- devuser www-data somedir
  • โดยให้ web developer คนนั้นเป็น owner
  • ให้ owner มีสิทธิ์อ่านและเขียนได้ (rw-) ในระดับ file
  • ให้ owner มีสิทธิ์ทำทุกอย่างในระดับ folder
  • Apache server จะเข้าไปอ่านไฟล์ หรือเข้าfolder ไปด้วยการใช้สิทธิ์เนื่องจากเป็น group (ชื่อ www-data)
  • ในระดับ folder ต้องตั้งให้มี executable bit ('x') เพื่อใช้ในการรัน PHP  (แต่ในนี้มันใช้ร่วมกับ sticky bit เลยเห็นเป็น 's' แทน, ถ้าไม่มี executable bit จะเห็นเป็น 'S')
  • ใช้ sticky bit ('s') เพื่อส่งต่อ group ชื่อ "www-data" ไปสู่ไฟล์ที่สร้างขึ้นมาใหม่ 
  • คำสั่ง : chown -R devuser /var/www     (เพราะ group 'www-data' จะเป็น default อยู่แล้ว)
  • คำสั่ง : chmod -R 2750 /var/www  (2 คือ sticky bit ที่จะคงค่า group id ให้กับไฟล์ใหม่, 7=rwx, 5=r-x)
  • อาจจะใช้ chmod -R 4750 /var/www แทนได้  (4 คือ sticky bit ที่จะคงค่าไว้ ทั้ง user และ group)
  • ถ้าจะเปลี่ยน ไฟล์ทั้งหมดอย่างเดียว ใช้  find /var/www -type f -exec chmod 0640 {} \;
  • ถ้าจะเปลี่ยน โฟล์เดอร์อย่างเดียว จะใช้ find /var/www -type d -exec chmod 2750 {} \;   (หรือ 4750)
  • ตั้ง umask (ใน /etc/profile หรือ ~/.profile) ให้เป็น 0137 เพื่อให้ไฟล์ที่เราสร้างขึ้นมาใหม่มี permission เป็น 0777 - 0137 = 0640 = rw-r-----
2. มี web developer หลายคน ใช้ร่วมกัน
ให้ตั้งให้ ทุก users ที่ต้องการจะเขียนไฟล์ลง server มี group ร่วมกัน เช่น 'www-data'
หรือจะสร้าง group ใหม่สำหรับ web developer โดยเฉพาะ เช่น ตั้งชื่อว่า 'webdev'
แล้วเพิ่ม user คนนั้นเข้าไปในกลุ่มใหม่นี้
โดยการใช้คำสั่ง usermod -a -G webdev devuser2

Permission ที่จำเป็นก็จะกลายเป็น
-rw-rw-r-- devuser2 webdev somefile
drwxrxsr-x devuser2 webdev somedir
  • เจ้าของไฟล์(owner) ในทีนี้คือ devuser2 จะมีสิทธิ์ทั้งอ่านและเขียนไฟล์ (rw-) และอ่านเขียนรัน(rwx) ในโฟล์เดอร์ที่เขาสร้าง
  • กลุ่ม webdev ด้วยกัน ก็จะสามารถเข้าไปแก้ไขไฟล์ๆนั้นได้ (rw-) และอ่านแก้ไขและรันได้(rwx) ในระดับ folder เหมือนเจ้าของเลย
  • แต่เนื่องจาก 'devuser2' ไม่ใช่ชื่อuserของ Apache server, และ 'webdev' ไม่ใช่กลุ่มของ Apache server อยู่
  • ดังนั้นจึงต้องเปิด permission สำหรับคนอื่นๆ (other หรือ world) ให้สามารถอ่านไฟล์ได้ (r--) และ อ่านและรันได้ในระดับโฟล์เดอร์(r-x) เพื่อที่จะทำให้ Apache สามารถใช้งาน PHP ในนั้นได้
  • ยังคงต้องใช้ sticky bit ('s') สำหรับ group อยู่ดี
  • คำสั่ง: chown -R devuser1:webdev /var/www   (ให้ทุกอย่างเป็นของ 'devuser1' และ กลุ่ม 'webdev')
  • สั่ง: find /var/www -type f -exec chmod 664 {} \;  (ให้ทุกไฟล์เป็น -rw-rw-r--)
  • สั่ง: find /var/www -type d -exec chmod 2775 {} \; (ให้ทุกโฟล์เดอร์เป็น drwxrxsr-x) 

No comments:

Post a Comment