FTPログインユーザーを単一のディレクトリに制限する安全な方法

FTPログインユーザーを単一のディレクトリに制限する安全な方法

単一のFTPルートディレクトリに複数のユーザーFTPログインを提供する必要があります。一部は書き込み可能で、一部は読み取りのみ可能です。私は彼らがファイルシステムの対応するディレクトリの上に何も見ないことを願っています。検索後(一般的な問題のようです)、user_local設定オプションをルートディレクトリとして定義し、chroot_local_usersオプションまたはchroot Jailを使用してユーザーをそのディレクトリに制限しました。これは基本的に機能します。

私の問題は理由はわかりませんが、セキュリティのためにchroot刑務所に頼ることは一般的に眉をひそめることです。最も重要なのは、カーネル開発チーム(少なくとも1人)によって目をつぶすことです。

もしそうなら、ログインしたユーザーがchroot Jailなしで定義されたルートディレクトリの上のエントリを表示できないように制限するにはどうすればよいですか? (タイトルに記載されている質問の「セキュリティ」部分です)

また、セキュリティ上の理由から(まだ理解されていない)、最新バージョンではvsftpdユーザーのルートへの書き込みが許可されていないため、2つのオプションが残ります。 1. セキュリティ機能を無効にし、root に書き込み可能なままにするか、2. root 書き込みビットを削除し、その中に書き込み可能なサブディレクトリを作成します。前者は不満であり、後者は見苦しく、エラーが発生しやすいです(ユーザーがルートディレクトリに書き込もうとするとエラーが発生します...)。私は後者を選びました。

それでは、FTPサービスを提供する正しい方法は何ですか?これは、ユーザーがファイルシステムの無関係な部分を安全な方法で見ないようにする方法を意味しますか? FTPはファイルを配布する本質的に安全ではない方法ですか?それでは、もっと良い方法はありますか?これを修正しようとしています...

答え1

注:このソリューションは私にとって効果的で、設定も簡単でした。 vsFTPdを使用するとします。

私はすべてのユーザーをホームディレクトリに閉じ込め、それらの間に「共有」というフォルダを共有しました。

  1. ユーザーを自宅に直接送信する

    $ sudo vi /etc/vsftpd/vsftpd.conf
    

    これが次の構成であることを確認してください。

    anonymous_enable=NO
    local_enable=YES
    chroot_local_user=YES
    

    vsftpdを再起動します。

    $ sudo service vsftpd restart
    
  2. すべてのユーザーの共有フォルダを作成し、「ftp」権限を付与します。

    $ cd /var/ftp
    $ mkdir shared
    $ chmod 777 shared/
    $ chgrp ftp shared/
    $ chown ftp shared/
    
  3. 投獄されたユーザーがこの共有フォルダにアクセスできるようにする

    刑務所に閉じ込められたユーザーSamを例に挙げてみましょう。

    今、あなたはルートだと仮定します。

    $ su - sam
    $ cd /home/sam
    $ mkdir Shared
    $ exit
    

    これでrootに戻りました。

    $ mount -o bind /var/ftp/shared /home/sam/Shared
    

    FTPグループにサムを追加する

    $ usermod -a -G ftp sam
    

    共有フォルダに他のユーザーを追加するには、この手順を繰り返します。

Samは自分のホームフォルダにアクセスでき、他のすべてのユーザーがアクセスできる追加の「共有」フォルダがあります。

答え2

この問題はインターネットに浮かぶ問題であり、明確な解決策が見つかりませんでした。

それが私が今立っているところです(詳細は更新します)。

基本的な問題は、httpクライアントが単にhttpサービスプロセスに要求を送信するのではなく、FTPでユーザーがログインしてファイルシステムを操作できるようにすることです。

したがって、定期的にログインしている場合、FTPユーザーがシステム上のユーザーに許可された操作を実行するのを制限することは困難です。 FTPユーザーには、下位レベルのブランチからの書き込みまたは読み取りを可能にするためにビューアクセスを制限するディレクトリに対する実行権限が必要です。したがって、彼の視聴権を制限する唯一の簡単な方法は、彼をchroot刑務所に閉じ込めることです。

Chroot Jailは、単に「/」で始まるパスへのすべての参照が単一の引数として渡され、パスですが、「現在の作業ディレクトリは変更されずに残り、相対パスはまだ新しいルートディレクトリの外のファイルを参照できますあります。」ソースです。http://lwn.net/Articles/252794/

セキュリティの観点からは、これが何を意味するのか、FTPデーモンとユーザー権限に関してどれほど危険なのかはわかりませんが、「chroot Jail」の「Jail」は間違った名前です。

Linuxについて深く理解している場合は、プロセスとユーザーの権限を定義して、このセキュリティコンテキストでchrootを「使用」できるようです。しかし、この問題で苦しんでいる私や多くのインターネットユーザーはまだ「達成」していません。

実際には、刑務所のように動作するのに十分なchroot刑務所を強化することも可能です。カーネル開発者Alan Cox氏によると、「chrootはセキュリティツールではなくセキュリティツールだったこともありません。人々はchrootのプロパティに基づいて何かを構築しました。タスクを実行するためにLSMモジュールを直接書くこともできます。結局のところ、そうです。配布FTPサイトがこのようなまたは同様の方法でセキュリティを処理する可能性があります。

現実的に今できることはchroot Jailを使うことだけです。なぜなら、私のサーバーは優先度の低いターゲット(存在する場合)であり、私のユーザーはデフォルトで信頼できるからです。私のセキュリティポリシーは、人々が被るダメージを制限することです。刑務所の休憩。これを行うには、ユーザーを仮想ユーザーとして適切に構成するか、仮想マシンでフルサービスを実行する必要があります。

学習が進むにつれて、LSMなどを通じてセキュリティのためにchroot()の概念を実施することを望み、上記のAlan Coxの引用に基づいてBSDにすでに「刑務所」の概念があることに言及したので、おそらく次のためにBSD使用を検討します。私のFTPが必要です。

答え3

クライアントがsftp経由で私のサーバーにファイルを送信できるように、刑務所に閉じ込められたsftpuserを作成する方法は次のとおりです。

  1. SFTPグループの作成

    # groupadd sftpusers
    
  2. SFTPユーザーを作成します。

    # useradd -g sftpusers -d /incoming/client1 -s /sbin/nologin \
          client1srs passwd client1srs
    
  3. ユーザーを変更し、ユーザーをSFTP専用にし、SFTP刑務所に入れます。

    # usermod -g sftpusers -d /incoming -s /sbin/nologin client1srs
    
  4. sshd_configでsftp-serverサブシステムを設定する

    /etc/ssh/sshd_configを修正してコメントアウトします。

    # #Subsystem       sftp    /usr/libexec/openssh/sftp-server
    
  5. 次に、次を追加します。

    Subsystem       sftp    internal-sftp
    
  6. グループの Chroot ディレクトリの指定

    /etc/ssh/sshd_config の末尾に次の行を追加します。

    Match Group sftpusers
           ChrootDirectory /sftp/%u
           ForceCommand internal-sftp
    
  7. SFTPホームディレクトリの作成

    # mkdir /sftpdir/client1srs/incoming
    # chown client1srs:sftpusers /sftpdir/client1srs/incoming
    
  8. SSHを再起動

    # /sbin/service sshd restart
    

答え4

短い答え:使用必須 -または役割ベース -アクセス制御以下のアップデート2を参照してください。

はい、FTPは本質的に安全ではありません。 sftpとscpはいくつかの不安全な問題を解決しますが、ファイルシステムの一部を隠す問題は解決しません。 NFSボリュームが必要ですか?

~によるとvsftpd FAQ、chrootの問題は、ユーザーにルートファイルシステムの読み取り/書き込み制御を提供することです。

vsftpdは、それぞれパターンマッチングを使用してファイルを非表示にしてアクセスできないようにするために使用できる設定をhide_file提供します。deny_fileドキュメントに記載されているように、これらのオプションは「非常に単純なので、厳格なアクセス制御には使用しないでください。ファイルシステムの権限を優先する必要があります」

ユーザーがFTPを介して実行する必要がある操作に応じてvsftpdcmds_allowedまたはcmds_denied

FTPデーモンを実行できます~へドッカーコンテナ、コンテナにインストールされているホストマシンのデータディレクトリから。ユーザーはコンテナ全体を見ることができますが、ホストには他のものを見ることはできません。おそらく、xinetdを使って作成できます。ドッキング各クライアント接続のvsftpdプロセス。これにより、マウントされたデータボリュームを除くコンテナの内容はすべて一時的になり、接続が閉じられると消えます。

修正する:FTPの使用別々のデータ接続移動する。 Docker内でFTPサーバーを実行するには、そのサーバーがまだデータ接続をネゴシエートして確立できることを確認する必要があります。これは次の方法で行うことができます。コンテナの実行--net=host を使用するか、コンテナの内部と外部の両方で追加のネットワーク構成を使用できます。上記のようにxinetdを使用して要求時にdocker ftpコンテナを作成するには、これらの設定を各コンテナに対してただちに実行する必要があります。

アップデート2:Dockerはセキュリティを保証しません。 脆弱性が発見されました、セキュリティはプロジェクトの主な目的ではありません。権限のないユーザーとしてftpdを実行するには、コンテナを使用することをお勧めします。

実際の解決策は、サーバーのアクセス制御メカニズムを補完することです。鎧を適用SELinuxまたは安全。私はこれらのどれもコンテナ、chroot、または刑務所なしで十分な解決策になると信じています。

関連情報