من میخواهم به یک کاربر یک حساب SSH بدهم اما او را نمیشناسم و اطمینان کافی ندارم. چطور میتوانم وی را به یک دایرکتوری خاص محدود کنم؟ چیزی مثل دایرکتوری /home/httpd/$USERNAME. چطور میتوانم یک ssh chrooted 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 بر روی یک سرور اوبونتو یا دبیان آموزش میدهد و بر روی دبیان نسخه 8.1 آزمایش شده است.
اگر میخواهید نام توزیعی را که از آن استفاده میکنید پیدا کنید، دستور زیر را در ترمینال وارد کنید و نتیجه را بررسی کنید. برای من خروجی به صورت زیر است.
# 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/passswd دادید، مجددا فایل /etc/{passwd,group} را با اجرای دو دستور زیر باز رونوشت کنید.
cp -vf /etc/{passwd,group} $D/etc/
Match User tom,jerry
ChrootDirectory /home/jails
## Allow sftp to chrooted jail ##
ForceCommand internal-sftp
گام هفتم: سرویس sshd را ری استارت کنید. برای این کار در دبیان 8 به صورت زیر عمل میشود.
# systemctl restart ssh.service
و در دبیان 7 به این صورت:
# /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 [email protected]
نمونهای از خروجی
[email protected]’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
منبع: salam-donya
گیگ بوی سایت آموزش شبکه به صورت فارسی و تصویری و دانلود نرم افزار