دلایل متعددی وجود دارد که ممکن است شما بخواهید برای یک کاربر در لینوکس دسترسی ssh محدود و مدیریت شده ایجاد نمائید. یکی از مهمترین دغدغه ها در چنین کاری امنیت است و قطعا شما از این بابت نگرانی خواهید داشت. ما امروز میخواهیم روش ایجاد دسترسی ssh محدود در یک محیط ایزوله را با روش chroot به شما آموزش دهیم. برای پیاده سازی این راهکار، لازم است چند مرحله را با هم طی نمائیم.
۱- ایجاد jail به روش chroot
در این مرحله شما می بایست یک دایرکتوری با نام کاربری که میخواهید آن را در سرور بسازید ایجاد نمائید:
1 |
[root@arshatech ~]# mkdir -p /home/userjail |
لازم است بدانید که یک کاربر می بایست حتما به بعضی مسیرهای خاص در سرور دسترسی داشته باشد. در این مرحله می بایست مسیرهای مد نظر را برای یوزر شبیه سازی کنیم:
1 2 |
[root@arshatech ~]# mkdir -p /home/userjail/dev [root@arshatech ~]# cd /home/userjail/dev |
حال باید از دستور mknod جهت این کار استفاده کنیم. با استفاده از سوئیچ m- سطح دسترسی را مشخص میکنیم و حرف c بیانگر کاراکترهای کوچک و بزرگیست که فایل های ایجاد شده باید به آن ها اشاره کنند:
1 2 3 4 |
[root@arshatech dev]# mknod -m 666 null c 1 3 [root@arshatech dev]# mknod -m 666 tty c 5 0 [root@arshatech dev]# mknod -m 666 zero c 1 5 [root@arshatech dev]# mknod -m 666 random c 1 8 |
حال جهت تخصیص دسترسی های صحیح به jail ایجاد شده دستورات زیر را وارد میکنم:
1 2 |
[root@arshatech ~]# chown root:root /home/userjail [root@arshatech ~]# chmod 0755 /home/userjail |
حال صحت تخصیص سطوح دسترسی را بررسی میکنیم. خروجی شما باید چیزی شبیه این باشد:
1 |
[root@arshatech ~]# ls -ld /home/userjail |
1 |
drwxr-xr-x 3 root root 4096 Oct 31 12:57 /home/userjail |
۲- ساخت محیط شل برای یوزر
در این مرحله می بایست محیط شل را برای کاربر ایجاد نمائیم. برای این کار دایرکتوری bin را ساخته و bash را داخل آن کپی میکنیم:
1 2 |
[root@arshatech ~]# mkdir -p /home/userjail/bin [root@arshatech ~]# cp -v /bin/bash /home/userjail/bin/ |
1 |
‘/bin/bash’ -> ‘/home/userjail/bin/bash’ |
حال با استفاده از دستورات زیر پیشنیازهای شل ایجاد شده را کپی میکنیم:
1 |
[root@arshatech ~]# ldd /bin/bash |
1 2 3 4 5 |
linux-vdso.so.1 => (0x00007ffef4cd6000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fc9393c6000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc9391c2000) libc.so.6 => /lib64/libc.so.6 (0x00007fc938df4000) /lib64/ld-linux-x86-64.so.2 (0x00007fc9395f0000) |
و در ادامه:
1 2 |
[root@arshatech ~]# mkdir -p /home/userjail/lib64 [root@arshatech ~]# cp -v /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /home/userjail/lib64/ |
1 2 3 4 |
‘/lib64/libtinfo.so.5’ -> ‘/home/userjail/lib64/libtinfo.so.5’ ‘/lib64/libdl.so.2’ -> ‘/home/userjail/lib64/libdl.so.2’ ‘/lib64/libc.so.6’ -> ‘/home/userjail/lib64/libc.so.6’ ‘/lib64/ld-linux-x86-64.so.2’ -> ‘/home/userjail/lib64/ld-linux-x86-64.so.2’ |
۳- تنظیمات ssh
در این مرحله میبایست یک یوزر ایجاد کرده و تنظیمات ssh را برای آن انجام دهیم:
1 2 |
[root@arshatech ~]# useradd myuser [root@arshatech ~]# passwd myuser |
1 2 3 4 |
Changing password for user myuser. New password: Retype new password: passwd: all authentication tokens updated successfully. |
حال فایلهای تنظیمات مربوط به یوزر را ایجاد میکنیم:
1 2 |
root@arshatech ~]# mkdir /home/userjail/etc [root@arshatech ~]# cp -vf /etc/{passwd,group} /home/userjail/etc/ |
1 2 |
‘/etc/passwd’ -> ‘/home/userjail/etc/passwd’ ‘/etc/group’ -> ‘/home/userjail/etc/group’ |
نکته: بعد از اینکه هر بار یک کاربر در سیستم ایجاد کردید می بایست فایل های به روز شده passwd و group را در مسیری که در بالا به شما گفته شده مجددا کپی نمائید.
حال در این مرحله می بایست به فایل تنظیمات ssh در سرور رفته و مسیر chroot و کاربر اضافه شده را در انتهای فایل وارد کنید:
1 |
[root@arshatech ~]# vim /etc/ssh/sshd_config |
1 2 |
Match User myuser ChrootDirectory /home/userjail/ |
سپس بسته به توزیعی که از آن استفاده میکنید سرویس ssh را ری استارت نمائید:
1 |
[root@arshatech ~]# systemctl restart sshd |
حال جهت تست با یوزر ایجاد شده ssh مکنیم:
1 |
[user@client ~]$ ssh myuser@192.168.1.100 |
1 2 3 4 5 |
-bash-4.2$ -bash-4.2$ ls -bash: ls: command not found -bash-4.2$ wget -bash: wget: command not found |
همچنین اگر مسیر جاری خود در سرور را ببینید به صورت زیر خواهد بود:
1 2 |
-bash-4.2$ pwd / |
۴- افزودن مسیرهای home و برخی دستورات لازم
اگر شما چند کاربر در سرور بسازید و jail ها را مشترک در نظر بگیرید کاربرهای شما به اطلاعات یکدیگر دسترسی خواهند داشت. همچنین اگر به ازای هر کاربر یک jail بسازید نیز کار اضافه کرده اید. پس بهتر است که از روش های استاندارد تبعیت کنیم:
1 2 3 |
[root@arshatech ~]# mkdir -p /home/userjail/home/myuser [root@arshatech ~]# chown -R myuser:myuser /home/userjail/home/myuser [root@arshatech ~]# chmod -R 0700 /home/userjail/home/myuser |
همچنین برای ایجاد دستورات ضروری برای کاربران خود میتوانید به صورت زیر عمل نمائید:
1 |
[root@arshatech ~]# cp -v /bin/{ls,touch,mkdir,cp,mv} /home/userjail/bin/ |
1 2 3 4 5 |
‘/bin/ls’ -> ‘/home/userjail/bin/ls’ ‘/bin/touch’ -> ‘/home/userjail/bin/touch’ ‘/bin/mkdir’ -> ‘/home/userjail/bin/mkdir’ ‘/bin/cp’ -> ‘/home/userjail/bin/cp’ ‘/bin/mv’ -> ‘/home/userjail/bin/mv’ |
حال برای هر دستور کافیست دستور ldd را اجرا کرده و پیشنیازها را کپی نمائید. بعنوان مثال:
1 |
[root@arshatech ~]# ldd /bin/ls |
1 2 3 4 5 6 7 8 9 10 |
linux-vdso.so.1 => (0x00007ffdfbf5d000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5ed64c6000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f5ed62c1000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f5ed60b8000) libc.so.6 => /lib64/libc.so.6 (0x00007f5ed5cea000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f5ed5a88000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f5ed5884000) /lib64/ld-linux-x86-64.so.2 (0x00007f5ed66ed000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f5ed567f000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5ed5463000) |
پس باید به صورت زیر عمل نمائید:
1 |
[root@arshatech ~]# # cp -v /lib64/{libselinux.so.1,libcap.so.2,libacl.so.1,libc.so.6,libpcre.so.1,libdl.so.2,ld-linux-x86-64.so.2,libattr.so.1,libpthread.so.0} /home/userjail/lib64/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
‘/lib64/libselinux.so.1’ -> ‘/home/userjail/lib64/libselinux.so.1’ ‘/lib64/libcap.so.2’ -> ‘/home/userjail/lib64/libcap.so.2’ ‘/lib64/libacl.so.1’ -> ‘/home/userjail/lib64/libacl.so.1’ cp: overwrite ‘/home/userjail/lib64/libc.so.6’? y ‘/lib64/libc.so.6’ -> ‘/home/userjail/lib64/libc.so.6’ ‘/lib64/libpcre.so.1’ -> ‘/home/userjail/lib64/libpcre.so.1’ cp: overwrite ‘/home/userjail/lib64/libdl.so.2’? y ‘/lib64/libdl.so.2’ -> ‘/home/userjail/lib64/libdl.so.2’ cp: overwrite ‘/home/userjail/lib64/ld-linux-x86-64.so.2’? y ‘/lib64/ld-linux-x86-64.so.2’ -> ‘/home/userjail/lib64/ld-linux-x86-64.so.2’ cp: cannot create regular file ‘/home/userjail/lib64/ld-linux-x86-64.so.2’: Text file busy ‘/lib64/libattr.so.1’ -> ‘/home/userjail/lib64/libattr.so.1’ ‘/lib64/libpthread.so.0’ -> ‘/home/userjail/lib64/libpthread.so.0’ |
حال اگر مجددا به سرور با یوزر محدود ایجاد شده ssh کنیم به صورت زیر تغییرات را خواهیم دید:
1 2 3 4 5 6 7 |
-bash-4.2$ pwd /home/myuser -bash-4.2$ ls -bash: ls: command not found -bash-4.2$ /bin/ls -bash-4.2$ /bin/ls -l total 0 |