web-dev-qa-db-ja.com

Linuxディレクトリのアクセス許可とSFTPの管理

おはようございます;特定のグループのみがSSH/SFTPを許可するように構成されたRHEL5.7Webサーバーがあります。コンテンツ管理者がそれぞれのディレクトリにコンテンツをアップロードし、アップロード方法やアプリケーションに関係なく、そのコンテンツがディレクトリのユーザー/グループの所有権を継承するようにしたいと思います。例えば:

  • Johnはグループに属しています"web" SSH/SFTP権限の場合"finance"ディレクトリ権限の場合、ディレクトリにアップロード"webstuff" SFTP経由。
  • ディレクトリ"webstuff"は "2760"(rwxrws ---)の権限を持ち、"Apache:finance"の所有権を持っています。

Johnが"webstuff"の既存のファイルに更新をアップロードした場合、ファイルの所有権は"Apache:finance"のままになります。 Johnが新しいファイルを"webstuff"にアップロードする場合、ファイルの所有権は"john:finance"です。

私の望みは、Johnからのファイルを"webstuff"にアップロードして、ディレクトリの所有者に変更することです。 setuidとsetgidの両方を設定してみましたが、ユーザー所有権はかかりませんでした。 ServerFaultでACLまたはSFTPのchrootされた刑務所を使用することについての言及を見たことがありますが、それらを構成してテストする必要があり、それらが実行可能なソリューションであるかどうかはわかりません(私もやったことがないので知っています)。どんな考えや援助も大歓迎です。

1
Dizzle

問題は、sftpがユーザーのIDとして実行されることです。最初に、sftpクライアントのsshが指定されたユーザーとしてターゲットホストに挿入され、次にsftp-serverが実行されます。 sftp-serverは通常のユーザーとして実行されているため、ファイルを「譲渡」する(ファイルの所有者を変更する)方法はありません。

ただし、scpを使用して、各ユーザーにキーペアを割り当てることができれば、これを回避できます。これには、rootの〜/ .ssh/authorized_keysファイルにユーザーのキーを追加し、「command =」パラメーターを指定して、サーバー側のscpプログラムの引数をサニタイズおよび変更するスクリプトを実行するように強制します。私は以前にこの手法を使用して、誰でもファイルを送信できる匿名のscpドロップボックスを設定し、送信されたファイルをだれも取得できないようにし、上書きを防止しました。

このテクニックに慣れている場合は、お知らせください。この投稿を簡単なレシピで更新します。

編集:コメントに基づいて、匿名のドロップボックスを設定するために最初に使用したレシピを次に示します。しかし、それはこの目的にも機能するはずです。

Johnにファイルをアップロードして/var/www/webstuffに書き込み、ユーザーID Apacheが所有するファイルを書き込みたい場合は、次のようにします。

1)sshキーペアを生成します。

ssh-keygen -t rsa -f john-scp-key  

2)公開鍵ファイル "john-scp-key.pub"を編集し、次のように先頭に "command ="ステートメントを挿入します。

command="/usr/local/bin/strictscp ^/var/www/webstuff" ssh-rsa AAAA..... (reset
of key follows)  

3)john-scp-key.pubの内容を~Apache/.ssh/authorized_keysファイルに追加します(ファイルが存在しない場合は作成し、.sshディレクトリとauthorized_keysの両方がApacheによって所有されていることを確認します。グループでも世界でも書き込み可能ではありません)

4)次のようにスクリプト/usr/local/bin/strictscpを作成します。

#!/bin/sh
read cmd arg1 arg2 <<EOT
$SSH_ORIGINAL_COMMAND
EOT
if [ "$cmd" = scp -a "$arg1" = -t ] && echo "$arg2" |grep "$1" >/dev/null 2>&1
then
    eval $cmd $arg1 $arg2
fi

5)次に、秘密鍵ファイルjohn-scp-keyをJohnに渡し、次のようにファイルをWebサーバーにコピーしてもらいます。

scp -i john-scp-key some_file.html Apache@yourserver:/var/www/webstuff/

これが機能する方法は、scpを使用してファイルをサーバーにコピーする場合、scpクライアントはsshを使用してサーバー上で「scp-t/path/name」を実行します。キーペアを使用する場合、実行されるコマンドをオーバーライドし、そのキーが使用されたときに特定のコマンドを強制的に実行することができます。要求された元のコマンドは、その引数とともに、環境変数「$ SSH_ORIGINAL_COMMAND」にあります。したがって、許可された引数をチェックするスクリプトをCOMMAND=にポイントし(この場合、3番目の引数が書き込み先の特定のディレクトリであることを確認します)、このキーは意図された目的にのみ有効です。サーバー上で任意のコマンドを実行するために使用することはできません。

ターゲットファイルが存在するかどうかを確認することで、strictscpスクリプトをもう少しロックダウンできます。また、最後にchgrpコマンドを追加して、ファイルのグループ所有権を設定することもできます( Apacheはそのグループのメンバーです)。

これがお役に立てば幸いです。問題が発生した場合はお知らせください。この回答をさらに改善できるかどうかを確認します。

1
Derek Pressnall