ftpchrootについて

一般ユーザでFTPアクセスをしたとき、ホームディレクトリ以外は見る事が出来ないようにしてセキュリティーを向上させる方法について記述します。

対象

  • 26環境
  • CAT709
  • CAT760

ftpchroot

/etc/ftpchroot ファイルに、制限を設けたいユーザー名を記述します。
例えば kaihatsu ユーザーに対してホームディレクトリ以外みることができないようにするには、次のようにします。

# /etc/ftpchroot: list of users who needs to be chrooted. See ftpchroot(5).
kaihatsu

ユーザー名 kaihatsu でFTPログインした際に、/home/kaihatsu ディレクトリがルート位置になるよう、chroot が実行されます。

しかしこれだけでは FTPでファイル名リストが取れなくなります。理由は /bin/ls へアクセスが出来ないからです。

そこで、~kaihatsu/bin/ls と ~kaihatsu/lib が必要になります。

ls

/bin/ls を ~kaihatsu/bin にコピーします。ディスク容量を節約するためにコピーではなくハードリンクを用います。

# su - kaihatsu
Password: kaihatsu
$ mkdir ~/bin
$ cd ~/bin
$ ln /bin/ls  .

ハードリンクは ln に -s を付けずに実行します。このときシンボリックリンクではNGです。なぜなら、ls -> /bin/ls というシンボリックリンクを作っても、/home/kaihatsu が / に chroot されているので自分自身を指すだけだからです。

次に/bin/ls が必要とするライブラリ一覧を取得します。

$ /lib/ld-linux.so.2 --list /bin/ls
       librt.so.1 => /lib/tls/librt.so.1 (0x29559000)
       libacl.so.1 => /lib/libacl.so.1 (0x2956f000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x29585000)
       libc.so.6 => /lib/tls/libc.so.6 (0x295a1000)
       libpthread.so.0 => /lib/tls/libpthread.so.0 (0x296b4000)
       /lib/ld-linux.so.2 (0x52aaa000)
       libattr.so.1 => /lib/libattr.so.1 (0x296d5000)

ここで得られた

       /lib/tls/librt.so.1
       /lib/tls/libc.so.6
       /lib/tls/libpthread.so.0
       /lib/libacl.so.1
       /lib/libgcc_s.so.1
       /lib/ld-linux.so.2
       /lib/libattr.so.1

が必要なライブラリファイルです。
さらに例えば一番上の /lib/tls/librt.so.1 をよく見てみると、

$ ls -l /lib/tls/librt.so.1
lrwxrwxrwx  1 root root 14 Feb 17  2006 /lib/tls/librt.so.1 -> librt-2.3.5.so

のようにシンボリックリンクになっていることが分かります。そこでシンボリックリンク先のlibrt-2.3.5.soも必要になります。librt.so.1 と librt-2.3.5.so をコピーしてくれば良いのですが、先ほどと同様にハードリンクを使うことにします。

$ mkdir -p lib/tls
$ cd lib/tls
$ ln /lib/tls/librt.so.1  .
$ ln /lib/tls/librt-2.3.5.so  .

以下同様に残りのファイルも全てハードリンクを作成します。

$ ln /lib/tls/libc.so.6  .
$ ln /lib/tls/libc-2.3.5.so  .
$ ln /lib/tls/libpthread.so.0  .
$ ln /lib/tls/libpthread-2.3.5.so  .
$ cd ../
$ ln /lib/libacl.so.1  .
$ ln /lib/libacl.so.1.1.0  .
$ ln /lib/libattr.so.1  .
$ ln /lib/libattr.so.1.1.0  .
$ ln /lib/ld-linux.so.2  .
$ ln /lib/ld-2.3.5.so  .
$ ln /lib/libgcc_s.so.1 .

この状態でツリー構造を見ると次のようになっているはずです

/home/kaihatsu/
|-- bin
|   `-- ls
`-- lib
    |-- ld-2.3.5.so
    |-- ld-linux.so.2 -> ld-2.3.5.so
    |-- libacl.so.1 -> libacl.so.1.1.0
    |-- libacl.so.1.1.0
    |-- libattr.so.1 -> libattr.so.1.1.0
    |-- libattr.so.1.1.0
    |-- libgcc_s.so.1
    `-- tls
        |-- libc-2.3.5.so
        |-- libc.so.6 -> libc-2.3.5.so
        |-- libpthread-2.3.5.so
        |-- libpthread.so.0 -> libpthread-2.3.5.so
        |-- librt-2.3.5.so
        `-- librt.so.1 -> librt-2.3.5.so

以上の準備を整えた後、inetdをリスタートさせてください

# /etc/init.d/inetd restart

試してみる

$ ftp localhost                          ← ローカルホストにFTPアクセス
Connected to localhost.localdomain.
220 ultracat2 FTP server (Version 6.4/OpenBSD/Linux-ftpd-0.17) ready.
Name (localhost:kaihatsu):
331 Password required for kaihatsu.
Password:
230 User kaihatsu logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd                                 ← カレントディレクトリを表示してみる
257 "/" is current directory.
ftp> cd /                                ← / 位置にcdしようとしてみる
250 CWD command successful.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for '/bin/ls'.
total 24
-rw-------  1 1000 1000  126 Apr  5 16:33 .bash_history
-rw-r--r--  1 1000 1000  414 Mar 30 20:54 .bash_profile
-rw-r--r--  1 1000 1000 2044 Mar 30 20:54 .bashrc
drwxr-xr-x  2 1000 1000 4096 Apr 12 07:01 bin
drwxr-xr-x  3 1000 1000 4096 Apr 12 07:26 lib
226 Transfer complete.
ftp> exit
221 Goodbye.

FTPアクセスの禁止

FTPアクセスを「禁止」したいユーザー名を /etc/ftpusers に列挙します

$ cat /etc/ftpusers
# /etc/ftpusers: list of users disallowed ftp access. See ftpusers(5).

root
ftp
anonymous

この例では、 root, ftp, anonymous でのアクセスが「禁止」されています

関連

Last-modified: 2006-04-12 (水) 16:39:21 (5716d)