اطلاعیه

بستن
هنوز اطلاعیه ای در دست نیست.

امنیت فایل ها و دایرکتوری ها با استفاده از ACL در لینوکس

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    امنیت فایل ها و دایرکتوری ها با استفاده از ACL در لینوکس

    به عنوان یک ادمین سیستم اولین اولویت ما باید محافظت و برقراری امنیت اطلاعات از دسترسی های غیر مجاز باشد. همه ما درباره پرمیژن ها و تعریف آنها با استفاده از دستورات لینوکسی مفیدی مانند chmod, chown و chgrp و غیره میدانیم. به هر حال این مجموعه پرمیژن های پیش فرض محدودیت هایی دارند و گاهی اوقات با توجه به نیاز ما کارایی ندارند. برای مثال ما نمیتوانیم مجموعه پرمیژن های متفاوتی برای کاربران متفاوت روی دایرکتوری یا فایل یکسان اعمال کنیم. بنابراین Access Control List (یا ACL) به کار برده میشوند.
    امنیت فایل ها و پوشه ها با استفاده از ACL




    همچنین توصیه میشود مقالات زیر را مطالعه کنید :

    7 ابزار برای Encrypt/Decrypt و محافظت از فایل ها با استفاده از پسورد در لینوکس

    ابزار LUKS برای Encrypt کردن Data روی هارد دیسک با فرمت NTFS در لینوکس

    دستور chattr برای ایجاد فایل های مهم و غیر قابل تغییر در لینوکس

    ابزار fswatch - مانیتور کردن تغییرات فایل ها و دایرکتوری ها در لینوکس

    دستور lsof برای مشاهده لیست فایل های باز در لینوکس

    چگونه بفهمیم در لینوکس چه کسی در حال استفاده از یک فایل است


    فرض کنید 3 کاربر linuxzone1, linuxzone2 و linuxzone3 داریم و هر کدام از آنها گروه مشترکی به نام acl دارند. کاربر linuxzone1 میخواهد که تنها کاربر linuxzone2 بتواند به فایل هایش دسترسی و امکان read داشته باشد و هیچ کس دیگری چنین دسترسی به فایل های linuxzone1 نداشته باشند.

    Access Control List به ما امکان انجام ترفند بالا را میدهد. این ACL ها امکان پرمیژن دادن برای یک کاربر، گروه و هر گروهی از از هر کاربرانی که در لیست گروه یک یوزر نیستند را فراهم میآورد.

    توجه : با توجه به مستندات redhat این سیستم عامل برای فایل سیستم ext3 و فایل سیستم export شده NFS پشتیبانی ACL را فراهم آورده است.



    چگونه پشتیبانی از ACL را روی سیستم های لینوکسی چک کنیم :

    قبل از هر کاری باید از پشتیبانی acl روی کرنل موجود و فایل سیستم های mount شده مطمئن شویم :


    1 - بررسی پشتیبانی کرنل از ACl :

    برای بررسی پشتیبانی از ACL در فایل سیستم دستور زیر را اجرا کنید و گزینه POSIX_ACL=Y باشد. (اگر به جای Y گزینه N باشد این بدان معناست که کرنل از acl پشتیبانی نمیکند و نیاز به دوباره کامپایل شدن (recompile) دارد :
    کد:
    [root@linux ~]# grep -i acl /boot/config*
    
    CONFIG_EXT4_FS_POSIX_ACL=y
    CONFIG_REISERFS_FS_POSIX_ACL=y
    CONFIG_JFS_POSIX_ACL=y
    CONFIG_XFS_POSIX_ACL=y
    CONFIG_BTRFS_FS_POSIX_ACL=y
    CONFIG_FS_POSIX_ACL=y
    CONFIG_GENERIC_ACL=y
    CONFIG_TMPFS_POSIX_ACL=y
    CONFIG_NFS_V3_ACL=y
    CONFIG_NFSD_V2_ACL=y
    CONFIG_NFSD_V3_ACL=y
    CONFIG_NFS_ACL_SUPPORT=m
    CONFIG_CIFS_ACL=y
    CONFIG_9P_FS_POSIX_ACL=y


    2 - بررسی پکیج های پیشنیاز :

    قبل از شروع کار با acl از نصب پکیج های پیشنیاز مطمئن شوید. پکیج های زیر در حقیقت مواردیست که باید با استفاده از yum یا apt-get نصب شود :
    کد:
    [root@linux ~]# yum install nfs4-acl-tools acl libacl        [on [B]RedHat[/B] based systems]
    کد:
    [linuxzone@linux ~]$ sudo apt-get install nfs4-acl-tools acl    [on [B]Debian[/B] based systems]


    3 - بررسی پشتیبانی فایل سیستم mount شده از ACL :

    اکنون چک کنید که آیا فایل سیستم mount شده با آپشن acl مانت شده است یا خیر؟ میتوانیم با استفاده از دستور mount همانطور که در زیر مشاهده میکنید بررسی کنیم :
    کد:
    [root@linux ~]# mount  | grep -i root  
    
    /dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)
    اما همانطور که در بالا میبینید به صورت پیش فرض acl نمایش داده نمیشود. بنابراین باید پارتیشن mount شده را بار دیگر با استفاده از اپشن acl مانت (remount) کنیم. اما قبل از آن باید مطمئن شویم که آیا پارتیشن با آپشن ACL مانت شده است یا خیر؟ زیر ممکن است با default mount option یکپارچه شده باشد :
    کد:
    [root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl  
    
    Default mount options:    user_xattr acl
    در خروجی بالا شما میتوانید ببینید که default mount option از acl پشتیبانی میکند. گزینه دیگر همانطو که گفتیم دوباره mount کردن پارتیشن میباشد :
    کد:
    [root@linux ~]# mount -o remount,acl /
    سپس خط زیر را به فایل /etc/fstab اضافه میکنیم تا پارتیشن همیشه mount باشد :
    کد:
    /dev/mapper/fedora-root /    ext4    defaults,acl 1 1

    دوباره پارتیشن را remount میکنیم :
    کد:
    [root@linux ~]# mount -o remount  /


    4 - در سرور NFS :

    در سرور NFS اگر فایل سیستمی که توسط سرور NFS اکسپورت (export) شده باشد از acl پشتیبانی کند و acl بتواند توسط کلاینت های NFS خوانده شود در نتیجه acl توسط سیستم کلاینت مورد استفاده قرار میگیرد.

    برای غیرفعال کردن acl روی NFS share شما باید آپشن no_acl را در فایل /etc/exportfs روی سرور NFS اضافه کنید. برای غیرفعال کردن آن رو کلاینت NFS هم باید دوباره آپشن no_acl را در طول مدت mount استفاده کنید.



    چگونه پشتیبانی ACL در سیستم های لینوکسی پیاده سازی کنیم :

    2 نوع acl وجود دارد :

    1 - Access ACL : برای پرمیژن دادن به هرفایل یا پوشه ای مورد استفاده قرار میگیرد.
    2 - Defult ACL : برای تعریف و دادن دسترسی روی یک دایرکتوری خاص استفاده میشود.



    تفاوت بین Access ACL و Default ACL :

    Default ACL میتواند تنها روی دایرکتوری ها اعمال شود.


    هر زیر دایرکتوری یا فایلی که درون دایرکتوری اصلی ایجاد شود ACL را از دایرکتوری parent خود به ارث میبرد. به عبارت دیگر یک فایل Default ACL را به عنوان Access ACL خود به ارث میبرد.

    ما برای تعریف Default ACL از آپشن -d استفاده میکنیم و در حقیقت کاملا optional و انتخابی میباشد.



    قبل از تعریف Default ACL :

    برای تعریف Default ACL برای یک فایل یا دایرکتوری خاص از دستور getfacl استفاده میشود. در مثال زیر getfacl برای دادن Default ACL به پوشه music استفاده شده است :
    کد:
    [root@linux ~]# getfacl Music/
    
    # file: Music/
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    default:user::rwx
    default:group::r-x
    default:other::rw-


    بعد از تعریف Default ACL :

    برای تعریف Default ACL برای یک دایرکتوری یا فایل خاص از دستور setfacl استفاده میشود. در مثال زیر دستور setfacl یک acl جدید (read and execute) روی فولدر music تعریف خواهد کرد :
    کد:
    [root@linux ~]# setfacl -m d:o:rx Music/
    [root@linux ~]# getfacl Music/
    # file: Music/
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    default:user::rwx
    default:group::r-x
    default:other::r-x


    نحوه تعریف ACL جدید :

    برای تعریف یا تغییر acl روی هر فایل یا دایرکتوری از دستور setfacl استفاده میشود. برای مثال برای دادن پرمیژن read و write به یوزر linuxzone1 باید دستور زیر را اجرا کنیم :
    کد:
    # setfacl -m u:linuxzone1:rw /linuxzone1/example

    نحوه نمایش ACL ها :

    برای نمایش acl روی هر فایل یا دایرکتوری از دستور getfacl استفاده میشود. برای مثال برای مشاهده acl روی /linuxzone1/example دستور زیر را اجرا کنید :
    کد:
    # getfacl /linuxzone1/example
    
    # file: linuxzone1/example/
    # owner: linuxzone1
    # group: linuxzone1
    user::rwx
    user:linuxzone1:rwx
    user:linuxzone1:r--
    group::rwx
    mask::rwx
    other::---


    نحوه حذف ACL :

    برای حذف acl از هر فایل یا دایرکتوری از آپشن های x و b استفاده میشود.



    حذف تنها acl مشخص شده از فایل یا دایرکتوری :
    کد:
    # setfacl -x ACL file/directory


    حذف تمام acl ها از فایل یا دایرکتوری :
    کد:
    # setfacl -b  file/directory

    اکنون acl را روی سناریو زیر پیاده سازی میکنیم.

    2 کاربر linuxzone1 و linuxzone2 هر دو گروه ثانویه مشترکی به نام acl دارند. ما یک پوشه با مالکیت linuxzone1 ایجاد کردیم و پرمیژن read و execute روی آن دایرکتوری را به یوزر linuxzone2 دادیم.



    مرحله 1 : ایجاد 2 یوزر و حذف پسورد از هر 2 آنها
    کد:
    [root@linux ~]# for user in linuxzone1 linuxzone2
    
    > do
    > useradd $user
    > passwd -d $user
    > done
    Removing password for user linuxzone1.
    passwd: Success
    Removing password for user linuxzone2.
    passwd: Success


    مرحله 2 : ایجاد یک گروه و دادن آن به عنوان گروه ثانویه به کاربران
    کد:
    [root@linux ~]# groupadd acl
    [root@linux ~]# usermod -G acl linuxzone1
    [root@linux ~]# usermod -G acl linuxzone2


    مرحله 3 : ایجاد یک دایرکتوری با نام linuxzone1 و تغییر مالکیت آن به کاربر linuxzone1
    کد:
    [root@linux ~]# mkdir /linuxzone1
    [root@linux ~]# chown linuxzone1 /linuxzone1/

    کد:
    [root@linux ~]# ls -ld /linuxzone1/  
    drwxr-xr-x 2 linuxzone1 root 4096 Apr 17 14:46 /linuxzone1/

    کد:
    [root@linux ~]# getfacl /linuxzone1
    
    getfacl: Removing leading '/' from absolute path names
    # file: linuxzone1
    # owner: linuxzone1
    # group: root
    user::rwx
    group::r-x
    other::r-x


    مرحله 4 : login کردن با linuxzone1 و ایجاد یک دایرکتوری در پوشه linuxzone
    کد:
    [linuxzone@linux ~]$ su - linuxzone1  
    
    Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
    کد:
    [linuxzone1@linux ~]$ cd /linuxzone1/
    [linuxzone1@linux linuxzone1]$ mkdir example

    کد:
    [linuxzone1@linux linuxzone1]$ ll  
    
    total 4
    drwxrwxr-x 2 linuxzone1 linuxzone1 4096 Apr 17 14:50 example

    کد:
    [linuxzone1@linux linuxzone1]$ whoami  
    linuxzone1

    مرحله 5 : تعریف ACL با استفاده از setfacl به طوری که linuxzone1 تمامی پرمیژن های rwx را داشته باشد و linuxzone2 تنها پرمیژن read روی پوشه example داشته و ما بقی هیچ پرمیژنی نداشته باشد.
    کد:
    $ setfacl -m u:linuxzone1:rwx example/
    $ setfacl -m u:linuxzone2:r-- example/
    $ setfacl -m  other:--- example/
    $ getfacl example/
    
    # file: example
    # owner: linuxzone1
    # group: linuxzone1
    user::rwx
    user:linuxzone1:rwx
    user:linuxzone2:r--
    group::r-x
    mask::rwx
    other::---


    مرحله 6 : اکنون با یوزر دیگری مانند linuxzone1 لاگین کنید و به دایرکتوری linuxzone1 وارد شوید. با استفاده از دستور ls سعی کنید محتویات دایرکتوری را ببینید سپس تلاش کنید به دایرکتوری example وارد شوید و تفاوت ها را مشاهده کنید :
    کد:
    [linuxzone@linux ~]$ su - linuxzone2
    
    Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
    کد:
    [linuxzone2@linux ~]$ cd /linuxzone1/
    [linuxzone2@linux linuxzone1]$ ls -lR example/
    example/:
    total 0
    کد:
    [linuxzone2@linux linuxzone1]$ cd example/  
    
    [B]-bash: cd: example/: Permission denied[/B]
    کد:
    [linuxzone2@linux linuxzone1]$ getfacl example/
    
    # file: example
    # owner: linuxzone1
    # group: linuxzone1
    user::rwx
    user:linuxzone1:rwx
    user:linuxzone2:r--
    group::rwx
    mask::rwx
    other::---


    مرحله 7 : اکنون پرمیژن execute به یوزر linuxzone2 روی پوشه example بدهید و سپس با استفاده از دستور cd به آن وارد شوید. اکنون linuxzone2 پرمیژن برای مشاهده و تغییر پوشه را دارد اما امکان write چیزی را ندارد :
    کد:
    [linuxzone1@linux linuxzone1]$ setfacl -m u:linuxzone2:r-x example/
    [linuxzone1@linux linuxzone1]$ getfacl example/
    
    # file: example
    # owner: linuxzone1
    # group: linuxzone1
    user::rwx
    user:linuxzone1:rwx
    user:linuxzone2:r-x
    group::rwx
    mask::rwx
    other::---
    کد:
    [linuxzone@linux ~]$ su - linuxzone2
    
    Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
    کد:
    [linuxzone2@linux ~]$ cd /linuxzone1/
    [linuxzone2@linux linuxzone1]$ cd example/
    [linuxzone2@linux example]$ getfacl .
    کد:
    [linuxzone2@linux example]$ mkdir test  
    
    [B]mkdir: cannot create directory ‘test’: Permission denied[/B]

    کد:
    [linuxzone2@linux example]$ touch test  
    
    [B]touch: cannot touch ‘test’: Permission denied[/B]

    توجه : بعد از پیاده سازی ACL در خروجی دستور ls -l یک نشانه اضافی + (مثبت) در مقابل پوشه مورد نظر خواهید دید :
    کد:
    [root@linux linuxzone1]# ll  
    
    total 4
    drwxrwx---+ 2 linuxzone1 linuxzone1 4096 Apr 17 17:01 example

    همچنین توصیه میشود مقالات زیر را مطالعه کنید :

    مدیریت کاربران، گروه ها، سطوح دسترسی و خصوصیت فایل ها در لینوکس

    5 نمونه از بهترین روش ها برای امنیت و نگهداری سرورهای لینوکس


    با آرزوی موفقیت ...
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 02-07-2021, 03:55 PM.

    #2
    سلام ممنون عالی بود ولی با افزونه زیر میشه براحتی این کار رو هم کرد نیازی به این همه خط فرمان نیست شاید یک وب مستر یا کاربر زیاد حرفه ای نباشه البته جناب habili شما استادی ما شاگردت این افزونه رو سایت کلد لینوکس بصورت رایگان در اختیار عموم قرار داده تا سرور ها رو تا حدودی امن کنند


    این پیچ رایگان می باشد، این نوع پچ نیازی به مجوز ندارد :


    اجرای خط فرمان زیر:
    کد PHP:
    curl -s https://repo.cloudlinux.com/kernelca...are_install.sh | bash 
    و بعد از اجرای خط فرمان بالا فرمان زیر را اجرا کنید:
    کد PHP:
    kcarectl --set-patch-type free --update 
    و مسیر زیر را ویرایش کنید:
    کد PHP:
    nano /etc/sysconfig/kcare/sysctl.conf 
    و کد زیر را داخل آن کپی پست کنید:
    کد PHP:
    fs.enforce_symlinksifowner 1
    fs
    .symlinkown_gid 48 
    و بعد از اون دستورات زیر را اجرا کنید.
    کد PHP:
    sysctl -w fs.enforce_symlinksifowner=1 sysctl -w
    fs
    .symlinkown_gid=48 
    و سرور خود را یک بار ریستارت کنید
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 08-14-2018, 01:23 PM.

    کامنت


      #3
      ممنون از محبت تون. حتما تست میکنم اسکریپت شما را هم

      کامنت

      درباره انجمن منطقه لینوکسی ها

      انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

      شبکه های اجتماعی
      در حال انجام ...
      X