5.4. 設定例

5.4.1. FTP サイトにアップロードする

特定のユーザーがファイルのアップロード専用として使用できる FTP サイトを作成している例を示します。 ディレクトリ構造を作成し、 必要となる SELinux 設定の変更を行なっています。
  1. root ユーザーで setsebool ftp_home_dir=1 を実行して FTP ホームディレクトリへのアクセスができるようにします。
  2. root ユーザーで mkdir -p /myftp/pub を実行して新規ディレクトリを最上位に作成します。
  3. Linux ユーザーの書き込みアクセスを許可するため、/myftp/pub/ ディレクトリで Linux パーミッションの設定を行ないます。以下の例では、所有者とグループを root から所有者 user1 とグループ root に変更します。書き込みアクセスを与えたいユーザーを「user1」の部分に入れてください。
    # chown user1:root /myftp/pub
    # chmod 775 /myftp/pub
    
    chown コマンドで所有者とグループのパーミッションを変更しています。chmod コマンドではモードを変更し、user1 ユーザーには読み取り、書き込み、実行のパーミッションを許可、root グループのメンバーには読み取り、書き込み、実行のパーミッションを許可しています。これ以外のユーザーには読み取りと実行のパーミッションを許可しています。このディレクトリ配下にあるファイルの読み込みを Apache HTTP Server に許可する必要があります。
  4. SELinux を実行する場合は、ファイルやディレクトリにアクセス許可のラベルを適切に付ける必要があります。Linux パーミッションの設定だけでは不十分です。ファイルに public_content_t タイプのラベルが付いている場合は、FTP、Apache HTTP Server、Samba による読み込みおよび再同期が可能です。ファイルに public_content_rw_t タイプのラベルが付いている場合は、FTP による書き込みが可能です。 Samba など FTP 以外のサービスによる public_content_rw_t タイプのラベルが付いているファイルへの書き込みについては、書き込みを行なう前にまず Boolean を設定しておく必要があります。最上位のディレクトリ (/myftp/) に public_content_t タイプのラベルを付け、/myftp/ 配下にコピーまたは新規作成されたファイルに対してサービスによる書き込みや変更が行なわれないようにします。root ユーザーで次のコマンドを実行し、ラベルの変更をファイルコンテキスト設定に追加します。
    semanage fcontext -a -t public_content_t /myftp
    
  5. restorecon -R -v /myftp/ を実行してラベルの変更を適用します。
    # restorecon -R -v /myftp/
    restorecon reset /myftp context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    
  6. /myftp には public_content_t タイプのラベル、/myftp/pub/ には default_t タイプのラベルが付いているか確認します。
    $ ls -dZ /myftp/
    drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /myftp/
    $ ls -dZ /myftp/pub/
    drwxrwxr-x. user1 root unconfined_u:object_r:default_t:s0 /myftp/pub/
    
  7. ユーザーが FTP 経由でファイルをアップロードできるようにするため、 まず先に FTP にディレクトリへの書き込みを許可する必要があります。 SELinux で FTP に書き込みを許可しているのは、public_content_rw_t タイプのラベルが付いたディレクトリです。ここでは、FTP に書き込みを許可するディレクトリとして /myftp/pub/ を使用しています。root ユーザーで次のコマンドを実行し、ラベルの変更をファイルコンテキスト設定に追加します。
    semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"
    
  8. root ユーザーで restorecon -R -v /myftp/pub を実行してラベルの変更を適用します。
    # restorecon -R -v /myftp/pub
    restorecon reset /myftp/pub context system_u:object_r:default_t:s0->system_u:object_r:public_content_rw_t:s0
    
  9. allow_ftpd_anon_write Boolean をオンにして、vsftpd による public_content_rw_t タイプのラベルが付いたファイルへの書き込みを許可する必要があります。root ユーザーで次のコマンドを実行し、この Boolean をオンにします。
    setsebool -P allow_ftpd_anon_write on
    
    再起動後、 変更を維持したくない場合は -P オプションを使用しないでください。
FTP でログインしてからファイルをアップロードする例を以下に示します。 ユーザーは前述の例と同じ user1 ユーザーを使用しています。 /myftp/pub/ ディレクトリは user1 が専用所有者となるディレクトリです。
  1. cd ~/ を実行してホームディレクトリに移動します。 次に、 mkdir myftp を実行して FTP 経由でアップロードするファイルを格納するディレクトリを作成します。
  2. cd ~/myftp を実行して ~/myftp/ ディレクトリに移動します。 このディレクトリ内に ftpupload ファイルを作成します。 以下の内容をこのファイルにコピーします。
    File upload via FTP from a home directory.
    
  3. getsebool allow_ftpd_anon_write を実行して、 allow_ftpd_anon_write Boolean がオンになっているか確認します。
    $ getsebool allow_ftpd_anon_write
    allow_ftpd_anon_write --> on
    
    この Boolean がオフになっている場合は、 root ユーザーで setsebool -P allow_ftpd_anon_write on を実行し Boolean をオンにします。 再起動後、 変更を維持したくない場合は -P オプションを使用しないでください。
  4. root ユーザーで service vsftpd start を実行し、 vsftpd を起動します。
    # service vsftpd start
    Starting vsftpd for vsftpd:                                [  OK  ]
    
  5. ftp localhost を実行します。 ユーザー名の入力が求められたら、 書き込みアクセスを持っているユーザーのユーザー名を入力し、 そのユーザーの正しいパスワードを入力します。
    $ ftp localhost
    Connected to localhost (127.0.0.1).
    220 (vsFTPd 2.1.0)
    Name (localhost:username):
    331 Please specify the password.
    Password: Enter the correct password
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> cd myftp
    250 Directory successfully changed.
    ftp> put ftpupload 
    local: ftpupload remote: ftpupload
    227 Entering Passive Mode (127,0,0,1,241,41).
    150 Ok to send data.
    226 File receive OK.
    ftp> 221 Goodbye.
    
    allow_ftpd_anon_write Boolean が有効になっているためアップロードが成功します。