Chroot login di Linux dengan menggunakan sshd

Asfihani (asfik@cakraweb.com)

26 Februari 2003

Pendahuluan

Tujuan dari chroot terhadap suatu login(account/user) adalah untuk "memenjarakan" user tersebut ke home direktorinya sendiri sehingga user yang bersangkutan tidak bisa "naik" ke direktori yang lebih tinggi diatasnya. Hal ini mungkin bisa meminimalisir usaha pembajakan terhadap suatu account yang lain (misalnya root) ataupun pencurian data user maupun data penting lainnya pada suatu sistem operasi linux.

Karena sshd yang mendukung chroot adalah sshd dari ssh.com, maka langkah yang pertama adalah menginstall sshd tersebut dan menguninstall openssh (sshd yang digunakan berlisensi free for non commercial use), jika anda sudah menggunakan sshd dari ssh.com anda bisa melewati langkah berikut ini :

[root@kurowo asfik]# wget ftp://ftp.ssh.com/pub/ssh/ssh-3.2.3.tar.gz
[root@kurowo asfik]# tar -xzvf ssh-3.2.3.tar.gz
[root@kurowo asfik]# cd ssh-3.2.3
[root@kurowo ssh-3.2.3]# ./configure
[root@kurowo ssh-3.2.3]# make
[root@kurowo ssh-3.2.3]# make install

Perhatian, langkah berikut ini sangatlah penting, silakan berhati-hati dalam mengerjakannya, terutama jika anda bekerja diserver secara remote. Aktifkan terlebih dahulu protokol telnet, hal ini untuk mencegah jika tiba-tiba kita tidak bisa terhubung ke server menggunakan ssh. Pada distro Redhat anda bisa menyunting file /etc/xinetd.d/telnetdan ubah pada bagian disable = yes menjadi disable = no. Kemudian restart xinetd :

[root@kurowo asfik]# service xinetd restart

Setelah ok, silakan masuk ke server melalui protokol telnet, langkah selanjutnya adalah langsung menghentikan sshd yang masih berjalan :

[root@kurowo asfik]# service sshd stop

Pastikan semua user telah logout (atau kita logoutkan secara pasti :D ):

[root@kurowo asfik]# killall -9 sshd 

Hapus openssh :

[root@kurowo asfik]# for a in $(rpm -qa | grep openssh); do rpm -e --nodeps $a; done

Semenjak root merupakan account yang keramat, maka kita putuskan untuk menolak ssh dengan login root dengan menyunting file /etc/ssh2/sshd2_config pada bagian PermitRootLogin menjadi :

PermitRootLogin                 no

Jalankan sshd yang terbaru dari ssh.com :

[root@kurowo asfik]# /usr/local/sbin/sshd

Untuk memastikan sshd yang baru secara otomatis dijalankan setiap server di reboot :

[root@kurowo asfik]# echo "/usr/local/sbin/sshd" >> /etc/rc.local

Silakan dicoba untuk melakukan ssh ke server tersebut, jika sukses, jangan lupa langsung mematikan kembali daemon telnet dengan menyunting kembali /etc/xinetd.d/telnet dan mengubah bagian disable = no menjadi disable = yes, dan karena kita tidak memerlukan xinetd :

[root@kurowo asfik]# service xinetd stop

Buat user baru yang akan dichroot (misalnya user niken ) sekalian kita set passwordnya :

[root@kurowo asfik]# useradd niken
[root@kurowo asfik]# passwd niken 
Changing password for user niken
New password:
Retype new password:
passwd: all authentication tokens updated successfully

Buat direktori etc,bin,lib didirektori /home/niken :

[root@kurowo asfik]# mkdir /home/niken/{etc,bin,lib} 

Buat entry untuk user niken di file /home/niken/etc/passwd dan /home/niken/etc/group :

[root@kurowo asfik]# grep ^niken /etc/passwd > /home/niken/etc/passwd
[root@kurowo asfik]# grep ^niken /etc/group > /home/niken/etc/group 

Install bash dengan menyalin file /bin/bash ke /home/niken/bin:

[root@kurowo asfik]# cp /bin/bash /home/niken/bin

Salin file library yang digunakan oleh bash (anda bisa memeriksanya dengan perintah ldd) :

[root@kurowo asfik]# ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4001d000)
libdl.so.2 => /lib/libdl.so.2 (0x40021000)
libc.so.6 => /lib/i686/libc.so.6 (0x40025000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
[root@kurowo asfik]# cp /lib/libtermcap.so.2 /home/niken/lib
[root@kurowo asfik]# cp /lib/libdl.so.2 /home/niken/lib
[root@kurowo asfik]# cp /lib/i686/libc.so.6 /home/niken/lib
[root@kurowo asfik]# cp /lib/ld-linux.so.2 /home/niken/lib

Atau bisa juga dengan menggunakan perintah ini :

[root@kurowo asfik]# for a in $(ldd /bin/bash | awk '{print $3}'); do cp $a /home/niken/lib/; done 

Untuk Redhat 7.x, salin pula file /lib/libnss_files.so.2, /lib/libnsl.so.1dan /lib/libnss_compat.so.2 :

[root@kurowo asfik]# cp /lib/libnss_files.so.2 /home/niken/lib
[root@kurowo asfik]# cp /lib/libnsl.so.1 /home/niken/lib
[root@kurowo asfik]# cp /lib/libnss_compat.so.2 /home/niken/lib

Jika diperlukan juga, install file-utils (ln,ls,rm,mv,cp,du,mkdir):

[root@kurowo asfik]# cp /bin/{ln,ls,rm,mv,cp,mkdir} /home/niken/bin
[root@kurowo asfik]# cp /usr/bin/du /home/niken/bin 

Periksa kembali library yang akan digunakan oleh file-file tersebut dengan menggunakan perintah ldd (misalnya: ldd /bin/ls dan seterusnya), kemudian salin ke direktori lib pada home direktori user yang bersangkutan. Ganti kepemilikan /home/niken ke user niken :

[root@kurowo asfik]# chown -R niken.niken /home/niken

Jika anda menginginkan agar user yang bersangkutan tidak bisa menghapus file/direktori yang digunakan dalam chroot, anda bisa menggunakan perintah chattr :

[root@kurowo asfik]# chattr -R +i /home/niken/{bin,etc,lib}

Langkah terakhir adalah menambahkan entry niken pada file /etc/ssh2/sshd2_config bagian ChRootUsers menjadi sebagai berikut :

ChRootUsers anonymous,ftp,guest,niken

Restart daemon ssh :

[root@kurowo asfik]# killall -HUP sshd

Jika sukses, anda bisa mencoba ssh ke localhost dengan menggunakan login niken :

[root@kurowo asfik]# ssh niken@localhost
niken's password:
Authentication successful.
Last login: Wed Feb 26 2003 12:51:42 +0700 from localhost
No mail.
bash-2.05$ ls -la
total 40
drwx------ 5 niken niken 4096 Feb 26 05:48 .
drwx------ 5 niken niken 4096 Feb 26 05:48 ..
-rw------- 1 niken niken 57 Feb 26 05:52 .bash_history
-rw-r--r-- 1 niken niken 24 Feb 26 05:21 .bash_logout
-rw-r--r-- 1 niken niken 191 Feb 26 05:21 .bash_profile
-rw-r--r-- 1 niken niken 124 Feb 26 05:21 .bashrc
-rw-r--r-- 1 niken niken 3511 Feb 26 05:21 .screenrc
drwxr-xr-x 2 niken niken 4096 Feb 26 05:47 bin
drwxr-xr-x 2 niken niken 4096 Feb 26 05:49 etc
drwxr-xr-x 2 niken niken 4096 Feb 26 05:53 lib

FIN