من میخواهم به یک کاربر یک حساب SSH بدهم اما او را نمیشناسم و اطمینان کافی ندارم. چطور میتوانم وی را به یک دایرکتوری خاص محدود کنم؟ چیزی مثل دایرکتوری /home/httpd/$USERNAME. چطور میتوانم یک ssh chroot jail بر روی لینوکس نصب کنم؟ اگر شما هم پرسشی مشابه دارید پس ادامه این راهنما را بخوانید.
به ChrootDirectory directive سلام کنید
در بخشی از راهنمای sshd_config میخوانیم
ChrootDirectory باید شامل فایلهای ضروری و دایرکتوریهایی باشد تا از نشست کاربر پشتیبانی کند. برای داشتن یک نشست فعال حداقل نیاز به یک پوسته، معمولا sh(1)، گرههای پایه /dev مانند: null(4)، zero(4)، stdin(4)، stdout(4)، stderr(4)، arandom(4) و tty(4) هستیم. برای نشست انتقال فایل با استفاده از «sftp» پیکربندیهای اضافه محیطی نیاز نمیباشد، البته این در صورتی است که از sftp در فرآیند استفاده شده باشد. با این حال نشستهایی که از logging استفاده میکنند، به جای chroot directory به /dev/log نیاز دارند.
پس از راه اندازی SSH chroot jail آن چیزی که کاربر میتواند ببیند یا اجرا کند محدود میشود. ادامه این راهنما نحوه ایجاد یک chrooted jail را برای OpenSSH بر روی یک سرور اوبونتو یا دبیان آموزش میدهد و بر روی دبیان نسخه ۸.۱ آزمایش شده است.
اگر میخواهید نام توزیعی را که از آن استفاده میکنید پیدا کنید، دستور زیر را در ترمینال وارد کنید و نتیجه را بررسی کنید. برای من خروجی به صورت زیر است.
# lsb_release -a
گام اول. به عنوان کاربر ریشه وارد سیستم شوید (در توزیعهای مختلف کاربر ریشه با نام root شناخته میشود) یکی از دو دستور زیر را وارد کنید.
$ su -
$ sudo -s
گام دوم. chroot jail را بسازید، jail همان قفس است که دسترسی کاربر در آن محدود میشود.
من در نظر دارم تا کاربر ssh را به دایرکتوری /home.jails/ محدود کنم، برای این کار به صورت زیر عمل میکنم:
# D=/home/jails # mkdir -p $D
بر اساس راهنمای sshd به فایلهای زیر نیز نیاز است:
# ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}
خروجی این دستور به صورت زیر است:
crw-rw-rw- 1 root root 1, 3 Jun 11 03:11 /dev/null crw-rw-rw- 1 root root 1, 8 Jun 11 03:11 /dev/random lrwxrwxrwx 1 root root 15 Jun 11 03:11 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 Jun 11 03:11 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 Jun 11 03:11 /dev/stdout -> /proc/self/fd/1 crw-rw-rw- 1 root tty 5, 0 Jun 11 04:43 /dev/tty crw-rw-rw- 1 root root 1, 5 Jun 11 03:11 /dev/zero
برای ایجاد گره /dev مورد نیاز از دستور mknod به صورت زیر استفاده کنید.
# mkdir -p $D/dev/ # mknod -m 666 $D/dev/null c 1 3 # mknod -m 666 $D/dev/tty c 5 0 # mknod -m 666 $D/dev/zero c 1 5 # mknod -m 666 $D/dev/random c 1 8
گام سوم. دسترسیها را تنظیم کنید.
دستور زیر را وارد کنید تا دایرکتوری $D مربوط به chroot و تمام محتویاتش به مالکیت کاربر ریشه دربیاید و توسط هر گروه یا کاربر دیگری جز کاربر ریشه قابل نوشتن نباشد.
# chown root:root $D # chmod 0755 $D
به صورت زیر این کار را بررسی کنید
# ls -ld $D
در آخر خروجیها مانند زیر خواهند بود.
drwxr-xr-x 2 root root 4096 Jun 11 03:14 /home/jails
گام چهارم. پوسته bash را در $D نصب کنید.
با استفاده از دستور زیر دایرکتوری bin را در مسیر $D ایجاد کنید.
# mkdir -p $D/bin
یک رونوشت از /bin/bash در دایرکتوری $D/bin/ ایجاد کنید.
# cp -v /bin/bash $D/bin
خروجی این دستور به صورت زیر است.
‘/bin/bash’ -> ‘/home/jails/bin/bash’
حالا نوبت به ایجاد یک رونوشت از کتابخانههای مورد نیاز اشتراکی در دایرکتوری $D است. دستور زیر بشکلی است تا موارد مورد نیاز bash را پیدا کند.
# ldd /bin/bash
بعد از انجام خروجی مانند زیر ایجاد میشود.
linux-vdso.so.1 (0x00007ffdbb1bc000) libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f1349bc6000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f134999c000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1349797000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f13493ee000) /lib64/ld-linux-x86-64.so.2 (0x00007f1349e0d000)
فایلهای هایلایت شده را یکی یکی با استفاده از دستور cp کپی کنید.
# mkdir -p $D/lib/ # mkdir -p $D/lib64/ # mkdir -p $D/lib/x86_64-linux-gnu/ # cp -v /lib/x86_64-linux-gnu/{libncurses.so.5,libtinfo.so.5,libdl.so.2,libc.so.6} $D/lib/
خروجی این کار مشابه زیر است.
‘/lib/x86_64-linux-gnu/libncurses.so.5’ -> ‘/home/jails/lib/libncurses.so.5’ ‘/lib/x86_64-linux-gnu/libtinfo.so.5’ -> ‘/home/jails/lib/libtinfo.so.5’ ‘/lib/x86_64-linux-gnu/libdl.so.2’ -> ‘/home/jails/lib/libdl.so.2’ ‘/lib/x86_64-linux-gnu/libc.so.6’ -> ‘/home/jails/lib/libc.so.6’
اکنون نوبت به ایجاد رونوشتی از /liv64/ld-linux-x86-64.so.2 در دایرکتوری /lib64 است.
# cp -v /lib64/ld-linux-x86-64.so.2 $D/lib64/
خروجی این دستور نیز به صورت زیر است.
‘/lib64/ld-linux-x86-64.so.2’ -> ‘/home/jails/lib64/ld-linux-x86-64.so.2’
در پایان این گام از تمام فایلهای /lib/x86_64-linux-gnu/libnss_files* به صورت زیر یک رونوشت تهیه کنید.
# cp -va /lib/x86_64-linux-gnu/libnss_files* $D/lib/x86_64-linux-gnu/
گام پنجم. افزودن کاربر به سیستم
علاوه بر تمام موارد قبلی نیاز است تا یک رونوشت از فایلهای /etc/passwd و /etc/group در دایرکتوری $D/etc/ ایجاد کنید. پس به صورت زیر عمل کنید.
# mkdir -p $D/etc/
در اینجا من دو کاربر با نامهای tom و jerry ایجاد میکنم
# adduser tom # adduser jerry
خروجی این مورد شبیه به خطوط زیر است.
اکنون نوبت به ایجاد یک رونوشت از فایلهای بروزشده /etc/{passwd,group} در دایرکتوری $D/etc/ است
# cp -vf /etc/{passwd,group} $D/etc/
خروجی این کار به صورت زیر است.
‘/etc/passwd’ -> ‘/home/jails/etc/passwd’ ‘/etc/group’ -> ‘/home/jails/etc/group’
هشدار: اگر هرگونه تغییری در کاربر و رمزعبور موجود در فایل /etc/passswd دادید، مجددا فایل /etc/{passwd,group} را با اجرای دو دستور زیر باز رونوشت کنید.
D=/home/jails cp -vf /etc/{passwd,group} $D/etc/
گام ششم. پیکربندی sshd
برای این موضوع فایل /etc/ssh/sshd_config را با ویرایشگر مورد علاقه خود ویرایش کنید. من اینجا از vim استفاده کردهام، کافی است vim را با نام ویرایشگر خود جایگزین کنید.
# vi /etc/ssh/sshd_config
خطوط زیر را به انتهای فایل باز شده اضافه کنید:
## Apply the chrooted jail to the user called tom and jerry ## Match User tom,jerry ChrootDirectory /home/jails ## Allow sftp to chrooted jail ## ForceCommand internal-sftp
گام هفتم. سرویس sshd را ری استارت کنید.
برای این کار در دبیان ۸ به صورت زیر عمل میشود
# systemctl restart ssh.service
و در دبیان ۷ به این صورت
# /etc/init.d/ssh restart
گام هشتم. آزمایش کنید
برای آزمایش کار کرد از ssh به صورت زیر استفاده کنید
ssh user@sever ssh user@sever-ip-here ssh tom@localhost
نمونهای از خروجی به صورت زیر است
tom@localhost's password: Last login: Thu Jun 11 04:32:32 2015 from localhost Could not chdir to home directory /home/tom: No such file or directory -bash-4.3$ ls -bash: ls: command not found -bash-4.3$ date -bash: date: command not found -bash-4.3$ pwd / -bash-4.3$
گام نهم. دستورات دیگر را نصب کنید
اکنون کاربر tom قادر به وارد شدن به سیستم است اما امکان اجرای دستوراتی مانند ls یا date را ندارد. در این حالت کاربر تنها به /bin/bash محدود شده است و اگر نیاز به دستورات دیگری دارد باید آنها را در دایرکتوری /home/jails نصب کنید، درست مثل زیر:
# cd /root/ wget http://www.cyberciti.biz/files/lighttpd/l2chroot.txt # mv l2chroot.txt l2chroot # chmod +x l2chroot # vi l2chroot
پس از دستور آخر ویرایشگر vi باز شده و شما باید در خطوط دیده شده به دنبال کلمه BASE باشید و آن را به صورت زیر تغییر بدهید.
BASE="/home/jails"
تغیرات را ذخیره کنید و خارج شوید. حالا /bin/ls را در @D/bin/ نصب کنید.
# cp -v /bin/ls $D/bin/ # cp -v /bin/date $D/bin/ # /root/l2chroot /bin/ls # /root/l2chroot /bin/date
دایرکتوریهای $D/home/tom و $D/home/jerry را با استفاده از دستورات زیر بسازید
# mkdir -p $D/home/{tom,jerry} # chown -R tom:tom $D/home/tom/ # chown -R jerry:jerry $D/home/jerry/ # chmod -R 0700 $D/home/tom/ # chmod -R 0700 $D/home/jerry/
گام آخر، گام دهم.
برای اتصال sftp از دستوراتی به شکل زیر میتوانید استفاده کنید.
sftp user@server sftp user@server-ip-here sftp tom@server1.cyberciti.biz
نمونهای از خروجی
tom@server1.cyberciti.biz's password: Connected to server1.cyberciti.biz. sftp> pwd Remote working directory: /home/tom sftp> ls sftp> cd /home sftp> ls jerry tom sftp> pwd Remote working directory: /home sftp> ls -l drwx------ 2 jerry jerry 4096 Jun 11 08:55 jerry drwx------ 2 tom tom 4096 Jun 11 08:53 tom sftp> cd jerry sftp> pwd Remote working directory: /home/jerry sftp> ls remote readdir("/home/jerry"): Permission denied sftp> ls remote readdir("/home/jerry"): Permission denied sftp> put /etc/resolv.conf . Uploading /etc/resolv.conf to /home/jerry/. remote open("/home/jerry/."): Permission denied sftp> cd /home/tom sftp> put /etc/resolv.conf . Uploading /etc/resolv.conf to /home/tom/./resolv.conf /etc/resolv.conf 100% 70 0.1KB/s 00:00 sftp> ls -l -rw-r--r-- 1 tom tom 70 Jun 11 09:01 resolv.conf sftp> quit
شاید تمایل داشته باشید تا وب سرور کاربر (DocumentRoot) را به دایرکتوری /home/jails نگاشت کنید، بنابراین اگر بخواهیم بگوییم که /home/httpd/tom_web همان DocumentRoot برای کاربر tom است، بشکل زیر عمل میکنیم.
# mkdir $D/home/tom/web # mount --bind /home/httpd/tom_web $D/home/tom/web ## update fstab file so that it can mount after server reboot ## # echo "/home/httpd/tom_web/ $D/home/tom/web none bind" >> /etc/fstab