CentOSベースのSFTPサーバーとして機能するようにインストールしました。
すべての受信ファイルを/ mnt/inbound /フォルダーに移動する必要があるため、SFTPを介してログインするこのホストからのすべてのユーザーが/ mnt/inbound /を開始点として取得し、移動できないことを確認したいどこか他の。
SFTPクライアントを使用してテストユーザーと接続でき、ユーザーがそれぞれのフォルダーに投獄されていることを確認できましたが、ユーザーはファイルをアップロードできません...
これが私がこれまでに行ったことです:
$ groupadd sftponly
# Enable built-in implementation of SFTP Subsystem sftp internal-sftp
Match Group sftponly # Force the connection to use the built-in SFTP support ForceCommand internal-sftp # Chroot the connection into the specified directory ChrootDirectory /mnt/inbound/%u # Disable network tunneling PermitTunnel no # Disable authentication agent forwarding AllowAgentForwarding no # Disable TCP connection forwarding AllowTcpForwarding no # Disable X11 remote desktop forwarding X11Forwarding no
$ Sudo useradd -g sftponly testuser
$ Sudo mkdir /mnt/inbound/testuser
FileZilla(またはその他のクライアント)を使用して、このホストへのSFTP接続を実行できます。ユーザーが/ mnt/inbound/testuserフォルダーに投獄されていることがわかります。ただし、ユーザーはファイルをアップロードできません。
/ mnt/inbound/testフォルダーの権限を変更してユーザーテストにアクセスできるようにしましたが、SFTP経由で接続するユーザーの機能が損なわれました。
フォルダーの所有者をroot以外に変更できないので、ユーザーがそれぞれのフォルダーに対して読み取りと書き込みを行えるようにするにはどうすればよいですか?
インターネット(StackExchangeを含む)で同様の質問に答えようとする試みを何度か見たことがありますが、回答に記載されている手順を実行しようとすると、常に壊れたSFTPセットアップになってしまうため、すべて1つまたは2つ欠けているようです。
よろしく、P.
#openssh IRCチャンネルでなんとかアドバイスを得ることができました、そしてここに私の解決策から欠けていたものがあります:
ChrootDirectoryで指定されたディレクトリは、ルートによって所有されている必要があります。上記のsshd_config
ファイルでは%u
変数を指定しているため、すべてのユーザーが自分のユーザー名に基づいて独自のルートディレクトリを持っています(たとえば、testuser
は/mnt/inbound/testuser/
になります)。これらのディレクトリのうち、ルートが所有している必要があります。 mkdir
コマンドはSudo
を介して昇格されるため、これは実際にSudo mkdir /mnt/inbound/<username>
を実行するディレクトリを作成するときのデフォルトです。
つまり、/mnt/inbound/<username>
の下にサブディレクトリを作成し、そのディレクトリにユーザーのアクセス許可を与える必要があります。私の場合、このディレクトリをuploads
と呼びました。
そこで、次のように構成を少し変更しました。
Match Group sftponly # Chroot the connection into the specified directory ChrootDirectory /mnt/inbound/%u # Force the connection to use the built-in SFTP support ForceCommand internal-sftp -d /uploads
ForceCommand
行は-d /uploads
を含むように変更されました。つまり、ユーザーがログインした後のデフォルトディレクトリは/uploads
です。これは/uploads
ではなく/mnt/inbound/%u/uploads
であることに注意してください。これは、構成の前の行で/mnt/inbound/%u
が新しいルートとして指定されたことを考慮しているためです。
ChrootDirectory /mnt/inbound/
を実行し、次にForceCommand internal-sftp -d /%u
を指定すると、/mnt/inbound/<username>
が所有する必要がある新しいルートディレクトリになるため、/mnt/inbound
フォルダーをエンドユーザーが所有するようにできます。 rootアカウントによって。ただし、ユーザーは親フォルダに移動して、他のすべてのアカウントのディレクトリ名を確認できます。私はそれに対して反対しました:)
/ mnt/inboundフォルダーをrootアカウントに変更し、inboundフォルダーに同じ名前のユーザーフォルダーを作成して、それらに完全な権限を与える必要があります。
Chrootオプションを使用して、各ユーザーがそれ自身のフォルダーのみを持ち、上に移動できないようにすることができます。
しかし、そのソリューションを使用して共通のアップロードフォルダーを持つことはできません。