Anonymous ftp の料理方法

Solaris に付属の機能を使用して Anonymous ftp を料理して、手軽に server にしていただきましょう。

最終更新日 : 1998 年 11 月 15 日


  1. 材料

    • Solaris がインストールされたコンピュータ。
      今回は Solaris2.6 / Ultra1 を素材にしました。

    • / もしくは /usr に 3MByte 程度の開き容量。

  2. ftp ユーザーの登録

    ログイン名は ftp さんとします。ユーザー番号はなんでもいいので 5000 として料理しました。

    # cd
    # useradd -u 5000 -d /public -s /bin/true -c "Anonymous FTP account" ftp

  3. ログインディレクトリの設定

    / ディレクトリに /public という名前で作成しました。持ち主は root さん、モードは 555 です。

    # mkdir /public
    # chown root /public
    # chmod 555 /public

  4. /public/usr の下の設定

    /public/usr の下に必要なコマンドを入れ込みます。

    # mkdir -p /public/usr/bin
    # cp /bin/ls /public/usr/bin
    # chmod 111 /public/usr/bin/ls
    # chmod 555 /public/usr/bin
    # ln -s usr/bin /public

  5. /public/usr/lib の下の設定

    さぁ、沢山あってめんどうですけど、 /public/usr/lib の下に必要なライブラリ ( ***.so.1 ) をコピーします。 ***.so でも使用できるようにシンボリック・リンクも作成します。

    # mkdir /public/usr/lib
    # cp /usr/lib/ld.so /usr/lib/ld.so.1 /public/usr/lib

    # cp /usr/lib/libc.so.1 /public/usr/lib
    # cp /usr/lib/libdl.so.1 /public/usr/lib
    # cp /usr/lib/libintl.so.1 /public/usr/lib
    # cp /usr/lib/libw.so.1 /public/usr/lib
    # ln -s ./libc.so.1 /public/usr/lib/libc.so
    # ln -s ./libdl.so.1 /public/usr/lib/libdl.so
    # ln -s ./libintl.so.1 /public/usr/lib/libintl.so
    # ln -s ./libw.so.1 /public/usr/lib/libw.so

    # cp /usr/lib/libnsl.so.1 /public/usr/lib
    # cp /usr/lib/libsocket.so.1 /public/usr/lib
    # cp /usr/lib/nss_nis.so.1 /public/usr/lib
    # cp /usr/lib/nss_nisplus.so.1 /public/usr/lib
    # cp /usr/lib/nss_dns.so.1 /public/usr/lib
    # cp /usr/lib/nss_files.so.1 /public/usr/lib
    # cp /usr/lib/straddr.so.2 /public/usr/lib
    # ln -s ./libnsl.so.1 /public/usr/lib/libnsl.so
    # ln -s ./libsocket.so.1 /public/usr/lib/libsocket.so
    # ln -s ./nss_nis.so.1 /public/usr/lib/nss_nis.so
    # ln -s ./nss_nisplus.so.1 /public/usr/lib/nss_nisplus.so
    # ln -s ./nss_dns.so.1 /public/usr/lib/nss_dns.so
    # ln -s ./nss_files.so.1 /public/usr/lib/nss_files.so
    # ln -s ./straddr.so.2 /public/usr/lib/straddr.so

    # chown 555 /public/usr/lib/*

  6. /public/etc の設定

    /public/etc の下に必要なファイルをコピーします。本体の passwd や group が見えないように空の passwd や group を作ります。空だと ftp でログインしたときユーザーやグループが数字で見えるようになります。そのくらいいいでしょ ?

    # mkdir /public/etc
    # touch /public/etc/passwd /public/etc/group
    # cp /etc/netconfig /public/etc
    # chmod 444 /public/etc/*

  7. /public/usr/share/lib/zoneifo の設定

    時間関係を管理する zoneinfo を tar でコピーしてきます。

    # mkdir -p /public/usr/share/lib/zoneinfo
    # ( cd /usr/share/lib/zoneinfo ; tar cf - . ) | ( cd /public/usr/share/lib/zoneinfo ; tar xf - )
    # chown -R root /public/usr/share/lib/zoneinfo
    # chmod -R 555 /public/usr/share/lib/zoneinfo

  8. /public/dev の設定

    ls -lL /dev/*** で表示されるメジャーコード、マイナーコードを確認しながら mknod で必要なデバイスを作成します。以下の例のコードは作業した時のものです。コンピュータによって違うと思いますので確認しましょう。

    # mkdir /public/dev
    # ls -lL /dev/zero
    # mknod /public/dev/zero c 13 12
    # ls -lL /dev/tcp
    # mknod /public/dev/tcp c 11 42
    # ls -lL /dev/udp
    # mknod /public/dev/udp c 11 41
    # ls -lL /dev/ticotsord
    # mknod /public/dev/ticotsord c 105 1
    # chmod 666 /public/dev/*
    # chown root /public/dev/*
    # chmod 555 /public/dev

  9. 必要なディレクトリの作成

    必要なディレクトリを作成しましょう。 anonymous ftp サービスでアクセスしたときによくある pub なんかですね。
    今回は 3 つのディレクトリを試しに作成してみましょう。

    • /pub : 読み出し専用のディレクトリ

      # mkdir /public/pub
      # chown root /public/pub
      # chmod 755 /public/pub

    • /pub_s : 読み書きできるけどファイル名が見えないディレクトリ

      # mkdir /public/pub_s
      # chown root /public/pub_s
      # chmod 1733 /public/pub_s

    • /pub_v : 読み書きなんでもありのディレクトリ

      # mkdir /public/pub_v
      # chown root /public/pub_v
      # chmod 777 /public/pub_v

  10. 試食

    さっそく試食してみましょう。ネットワークに接続された他のコンピュータから ftp すると、次のようになるはずですが ...
    /etc/hosts や NIS や BIND で名前が解決できる時は名前で、それらの設定が無いときは IP アドレスで ftp してみましょう。

    • anonymous ログインしてみる

      わ〜い。ちゃんと /public が / に chroot されているし、作ったディレクトリも見えるぞぉ

      % ftp 192.168.1.1
      Connected to 192.168.1.1.
      220 ultra1 FTP server (SunOS 5.6) ready.
      Name (192.168.1.1:pochi): anonymous
      331 Guest login ok, send ident as password.
      Password:
      230 Guest login ok, access restrictions apply.
      ftp> dir
      200 PORT command successful.
      150 ASCII data connection for /bin/ls (192.168.1.2,1417) (0 bytes).
      total 20
      dr-xr-xr-x 8 0 1 512 Oct 2 14:06 .
      dr-xr-xr-x 8 0 1 512 Oct 2 14:06 ..
      lrwxrwxrwx 1 0 1 7 Oct 2 13:56 bin -> usr/bin
      dr-xr-xr-x 2 0 1 512 Oct 2 12:56 dev
      drwxr-xr-x 2 0 1 512 Oct 2 11:30 etc
      drwxr-xr-x 2 0 1 512 Oct 2 12:57 pub
      drwx-wx-wt 2 0 1 512 Oct 2 14:00 pub_s
      drwxrwxrwx 2 0 1 512 Oct 2 14:00 pub_v
      drwxr-xr-x 5 0 1 512 Oct 2 11:37 usr
      226 ASCII Transfer complete.
      615 bytes received in 0.0026 seconds (2.3e+02 Kbytes/s)
      ftp> quit
      221 Goodbye.
      %

    • 通常の ftp ログインも確認してみる

      普通のユーザーでのログインもできました。一安心 !!

      % ftp 192.168.1.1
      Connected to 192.168.1.1.
      220 ultra1 FTP server (SunOS 5.6) ready.
      Name (192.168.1.1:pochi): root
      331 Password required for root.
      Password:
      230 User root logged in.
      ftp> quit
      221 Goodbye.
      %

    • /pub は書き込み禁止になっているかな

      put したらちゃんとエラーになったぞ !

      ftp> cd pub
      250 CWD command successful.
      ftp> bin
      200 Type set to I.
      ftp> hash
      Hash mark printing on (8192 bytes/hash mark).
      ftp> put pussy.gz
      200 PORT command successful.
      553 pussy.gz: Permission denied.

    • /pub_s は読み書きできるけどファイル名が見えないよね

      put get はできるけど dir するとちゃんと Permission denied になったぞ !

      ftp> cd pub_s
      250 CWD command successful.
      ftp> bin
      200 Type set to I.
      ftp> hash
      Hash mark printing on (8192 bytes/hash mark).
      ftp> put pussy.gz
      200 PORT command successful.
      150 Binary data connection for pussy.gz (192.168.1.2,1451).
      #####
      226 Transfer complete.
      local: pussy.gz remote: pussy.gz
      35100 bytes sent in 0.014 seconds (2.4e+03 Kbytes/s)
      ftp> dir
      200 PORT command successful.
      150 ASCII data connection for /bin/ls (192.168.1.2,1452) (0 bytes).
      .: Permission denied
      total 2
      #
      226 ASCII Transfer complete.
      31 bytes received in 0.0013 seconds (24 Kbytes/s)
      ftp> get pussy.gz
      200 PORT command successful.
      150 Binary data connection for pussy.gz (192.168.1.2,1453) (35100 bytes).
      ##########################
      226 Binary Transfer complete.
      local: pussy.gz remote: pussy.gz
      35100 bytes received in 0.074 seconds (4.6e+02 Kbytes/s)

    • /pub_v は読み書きもなんでもできるかな

      put get も dir もちゃんとできるぞ !

      ftp> cd pub_v
      250 CWD command successful.
      ftp> bin
      200 Type set to I.
      ftp> hash
      Hash mark printing on (8192 bytes/hash mark).
      ftp> put pussy.gz
      200 PORT command successful.
      150 Binary data connection for pussy.gz (192.168.1.2,1458).
      #####
      226 Transfer complete.
      local: pussy.gz remote: pussy.gz
      35100 bytes sent in 0.027 seconds (1.3e+03 Kbytes/s)
      ftp> dir
      200 PORT command successful.
      150 ASCII data connection for /bin/ls (192.168.1.2,1459) (0 bytes).
      total 80
      drwxrwxrwx 2 0 1 512 Oct 2 16:27 .
      dr-xr-xr-x 8 0 1 512 Oct 2 14:06 ..
      -rw-r--r-- 1 5000 1 35100 Oct 2 16:27 pussy.gz
      #
      226 ASCII Transfer complete.
      253 bytes received in 0.0016 seconds (1.6e+02 Kbytes/s)
      ftp> get pussy.gz
      200 PORT command successful.
      150 Binary data connection for pussy.gz (192.168.1.2,1460) (35100 bytes).
      ##########################
      226 Binary Transfer complete.
      local: pussy.gz remote: pussy.gz
      35100 bytes received in 0.17 seconds (2e+02 Kbytes/s)

  11. おまけ 1

    in.fpd(1) を見ると、

    This script assumes that ftphome is neither / nor /usr so ...
    ftphome must be non-null and neither / or /usr
    な表記があります。でもなぁ、 / とか /usr 以外の場所に作りたいなぁ ... と思って試したら、とりあえず動いてしまいました。何か不具合がでるかもしれませんが、こんな感じです。 /public に作成したものを /export/home の下に移動させています。いいのかなぁ ...

    # tar cf - public | ( cd /export/home ; tar xf - )
    # userdel ftp
    # useradd -u 5000 -d /export/home -s /bin/true -c "Anonymous FTP account" ftp
    # rm -r /public

  12. おまけ 2

    Solaris2.6 では、 in.ftpd が日本語環境で起動しているので ftp クライアントによってはバケバケ状態 ( Macintosh の Fetch とか ) になってしまったりします。じゃ、すなおに英語環境にしておきましょう。 /etc/inetd.conf を編集して、 in.ftpd を再起動します。

    # vi /etc/inetd.conf

    ftp stream tcp no wait root /usr/sbin/in.ftpd in.ftpd

    ftp stream tcp no wait root /bin/env LANG=C /usr/sbin/in.ftpd in.ftpd

    # ps -ef | grep in.ftpd
    root 105 742 0 16:30:00 ? 0:00 /usr/sbin/in.ftpd
    # kill -9 105
    # /usr/sbin/in.ftpd


[ Solaris 料理コーナー ] [ トップページ ]

BEKKOAME//INTERNET で公開していたページです。
作成: 1998 年 10 月 02 日〜 Copyright (C) 1998 Katsauki Shimizu <katsuaki-s @_nifty.com> All rights reserved.

access counter