เหตุใด 666 การอนุญาตให้สร้างไฟล์เริ่มต้น


12

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

ฉันรู้สำหรับไฟล์ที่เราต้องการสิทธิ์ในการปฏิบัติการเพื่อแสดงเนื้อหา
แต่ทำไมเรา จำกัด สิทธิ์การสร้างไฟล์เริ่มต้นใน 666


ระบบอะไร สิ่งเดียวที่umaskฉันพบคือ 0022 เสมอสร้างการอนุญาตเริ่มต้น 644
manatwork

ไม่คุณเข้าใจผิด Umask ใช้การอนุญาตไฟล์เริ่มต้นที่ 666 และลบย่อยค่าของมันเอง (ซึ่งคือ 0022 สำหรับระบบของคุณ) ดังนั้นการอนุญาตส่วนใหญ่ที่คุณสามารถตั้งค่าได้คือumask 0000- ซึ่งยังคง จำกัด สิทธิ์การเข้าถึงไฟล์ไว้ที่ 666 (แต่เห็นได้ชัดว่าโฟลเดอร์ใช้ 777)
Peter

เข้าใจแล้ว ตอนนี้เป็นคำถามที่ดี
จัดการ

2
คุณไม่จำเป็นต้องมีสิทธิ์ปฏิบัติการเพื่อดูเนื้อหาไฟล์ นี่คือดังนั้นสำหรับไดเรกทอรีซึ่งเป็นสาเหตุที่สร้างไดเรกทอรีโดยค่าเริ่มต้นด้วยสิทธิ์ดำเนินการ
โจเซฟอาร์

1
ฉันเชื่อว่า [แต่จะต้องดูให้แน่ใจมากขึ้น] ว่านี่คือการออกแบบเพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัย: หากไม่มีการเข้าถึง "chmod" คุณจะไม่สามารถเรียกใช้ไฟล์ได้ umask 0000 สร้างไฟล์ที่มี 0666 และไดเรกทอรีที่มี 0777 [ซึ่งโดยปกติแล้วเป็นการตั้งค่าเริ่มต้นที่แย่มากการรักษาความปลอดภัยที่ชาญฉลาด!]
Olivier Dulac

คำตอบ:


10

เท่าที่ฉันสามารถบอกได้นี่เป็นฮาร์ดโค้ดลงในโปรแกรมอรรถประโยชน์มาตรฐาน ฉันstraceทั้งการtouchสร้างไฟล์ใหม่และการmkdirสร้างไดเรกทอรีใหม่

การtouchติดตามเกิดขึ้น:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

ในขณะที่mkdirร่องรอยสร้างสิ่งนี้:

mkdir("newdir", 0777)                   = 0

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

ปรับปรุง

เพื่อให้ตัวอย่างว่าบิตสิทธิ์ได้รับการกำหนดค่าตายตัวลงในยูทิลิตี้มาตรฐานได้อย่างไร นี่คือบางบรรทัดที่เกี่ยวข้องจากสองไฟล์ในcoreutilsแพ็คเกจที่มีซอร์สโค้ดสำหรับทั้งสองtouch(1)และmkdir(1)อื่น ๆ :

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

ในคำอื่น ๆ ถ้าอยู่ในโหมดไม่ได้ระบุกำหนดให้S_IRWXUGO(อ่าน: 0777) umask_valueแก้ไขโดย

touch.c ชัดเจนยิ่งขึ้น:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

นั่นคือให้สิทธิ์การอ่านและเขียนแก่ทุกคน (อ่าน: 0666) ซึ่งจะถูกแก้ไขโดยกระบวนการumaskในการสร้างไฟล์แน่นอน

คุณอาจสามารถหลีกเลี่ยงปัญหานี้โดยทางโปรแกรมเท่านั้น: เช่นในขณะที่สร้างไฟล์จากภายในโปรแกรม C ซึ่งคุณสามารถโทรออกจากระบบโดยตรงหรือจากภายในภาษาที่ให้คุณสร้าง syscall ระดับต่ำ (ดูตัวอย่างของ Perl sysopenใต้perldoc -f sysopen)


คุณพูดถูกฉันไม่ต้องการอุบัติเหตุเลย แต่ไม่มีทางที่จะเปลี่ยนแปลงมันช่างน่ากลัว! ค่ามาตรฐานที่ควรจะเป็น 777 และเราต้องและumask file umask dirตั้งค่าเริ่มต้นที่แตกต่างกันสองและปรับ แต่ตอนนี้ฉันไม่มีวิธีสร้างไฟล์ด้วย exec perms
ปีเตอร์

1
@PeterI ดีmkdir(1)ให้คุณ-mสลับเพื่อระบุโหมดของไดเรกทอรีในเวลาที่สร้าง อย่างไรก็ตามด้วยไฟล์เนื่องจากการสร้างไฟล์ใช้open(2)syscall เครื่องมือที่คุณใช้ในการสร้างไฟล์เป็นสิ่งที่รับผิดชอบในการส่งบิตโหมดไปยังopenและคุณจะไม่พูดในเรื่องนี้ install(1)โดยค่าเริ่มต้นคัดลอกไฟล์ของคุณไปยังตำแหน่งใหม่และตั้งบิตดำเนินการ แต่ที่ยังไม่เกิดขึ้นในเวลาที่สร้าง
โจเซฟอาร์

สิ่งที่คุณกำลังพูดtouchเช่นมีหน้าที่รับผิดชอบในการตั้งค่าที่เหมาะสม คุณรู้หรือไม่ว่ามันเก็บค่าไว้ที่ไหน? บางทีพวกเขาอาจตั้งค่าทั้งระบบ - ดังนั้นเราสามารถเปลี่ยนได้หรือไม่ เพราะฉันต้องการพักฟรี ;)
Peter

@PeterI ดูคำตอบที่อัพเดตแล้ว
โจเซฟอาร์

1
@PeterI ฉันอัปเดตคำตอบอีกครั้ง คุณสามารถสร้าง syscall โดยตรงจากภายใน C หรือภาษาอื่นเช่น Perl
โจเซฟอาร์

6

ก่อนอื่นไม่มีค่าเริ่มต้นสากลการอนุญาตขึ้นอยู่กับแอปพลิเคชันที่สร้างไฟล์ ตัวอย่างเช่นโปรแกรม C ตัวน้อยนี้จะสร้างไฟล์ '/ tmp / foo' ที่มีสิทธิ์ 0777 หาก umask เป็น 0000 (ในกรณีใด ๆ สิทธิ์จะเป็น 0777 & ~ umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

อย่างที่กล่าวไปแล้วหลาย ๆ แอปพลิเคชั่นจะสร้างไฟล์ที่ได้รับอนุญาตจาก 0666 นั่นคือเหตุผลสองประการ:

  1. ความปลอดภัย: คุณไม่ต้องการให้ไฟล์ใด ๆ
  2. ความสะดวกสบาย: ไฟล์ส่วนใหญ่ไม่จำเป็นต้องสามารถใช้งานได้ เป็นการง่ายกว่าที่จะตั้งค่าบิตที่สามารถเรียกใช้งานได้บนไฟล์บางไฟล์ที่เลือกไว้กว่าจะยกเลิกการตั้งค่าบนไฟล์อื่น ๆ จำนวนมาก แน่นอนว่า umask 0133 จะแก้ปัญหานี้ แต่ก็ไม่มีอะไรชนะและคุณไม่สามารถให้โปรแกรมสร้างไฟล์ปฏิบัติการแม้ว่าคุณต้องการ

1
ไฟล์ถูกสร้างโดยไม่มีการตั้งค่าบิต x (ดำเนินการ) เพื่อเหตุผลด้านความปลอดภัย การเรียกใช้ไฟล์โดยไม่ตั้งใจ [cw] จะเป็น "Bad Thing" (tm) โปรแกรม chmod ช่วยให้คุณสามารถตั้งค่าบิตการอนุญาตได้ตามต้องการ
ChuckCottrill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.