Ubuntu18.04でシェルアクセスなしでSFTPを有効にする方法
序章
SFTP は、 S SH F ile T ransfer Protocolの略です。 その名前が示すように、暗号化されたSSH接続を使用してマシン間でファイルを転送する安全な方法です。 名前にもかかわらず、それは FTP ( F ile T ransfer P rotocol)とは完全に異なるプロトコルですが、現代では広くサポートされていますFTPクライアント。
SFTPはデフォルトで使用可能であり、SSHアクセスが有効になっているすべてのサーバーで追加の構成はありません。 安全で使いやすいですが、欠点があります。標準構成では、SSHサーバーは、システム上のアカウントを持つすべてのユーザーにファイル転送アクセスとターミナルシェルアクセスを許可します。
場合によっては、特定のユーザーのみにファイル転送を許可し、SSHアクセスを許可しないようにすることができます。 このチュートリアルでは、SSHデーモンを設定して、SFTPアクセスを1つのディレクトリに制限し、ユーザーごとにSSHアクセスを許可しません。
前提条件
このチュートリアルに従うには、Ubuntu18.04サーバーにアクセスする必要があります。 このサーバーには、sudo
権限を持ち、ファイアウォールが有効になっている非rootユーザーが必要です。 これを設定するためのヘルプについては、Ubuntu18.04の初期サーバーセットアップガイドに従ってください。
ステップ1—新しいユーザーを作成する
まず、サーバーへのファイル転送アクセスのみが許可される新しいユーザーを作成します。 ここでは、ユーザー名 sammyfiles を使用していますが、任意のユーザー名を使用できます。
- sudo adduser sammyfiles
アカウントのパスワードを作成するように求められ、続いてユーザーに関する情報が表示されます。 ユーザー情報はオプションであるため、ENTER
を押してこれらのフィールドを空白のままにすることができます。
これで、制限されたディレクトリへのアクセスが許可される新しいユーザーが作成されました。 次のステップでは、ファイル転送用のディレクトリを作成し、必要な権限を設定します。
ステップ2—ファイル転送用のディレクトリを作成する
SFTPアクセスを1つのディレクトリに制限するには、まず、ディレクトリがSSHサーバーのアクセス許可要件に準拠していることを確認する必要があります。これは非常に特殊です。
具体的には、ディレクトリ自体とファイルシステムツリー内のその上のすべてのディレクトリは、 root が所有している必要があり、他のユーザーが書き込みできないようにする必要があります。 したがって、ホームディレクトリは root ではなくユーザーが所有しているため、ユーザーのホームディレクトリへのアクセスを制限することはできません。
注: OpenSSHの一部のバージョンには、ディレクトリ構造と所有権に関するこのような厳密な要件はありませんが、ほとんどの最新のLinuxディストリビューション(Ubuntu 18.04を含む)にはあります。
この所有権の問題を回避するには、いくつかの方法があります。 このチュートリアルでは、ターゲットアップロードディレクトリとして/var/sftp/uploads
を作成して使用します。 /var/sftp
はrootによって所有され、他のユーザーが書き込むことはできません。 サブディレクトリ/var/sftp/uploads
はsammyfilesによって所有されるため、ユーザーはサブディレクトリにファイルをアップロードできます。
まず、ディレクトリを作成します。
- sudo mkdir -p /var/sftp/uploads
/var/sftp
の所有者をrootに設定します。
- sudo chown root:root /var/sftp
root に同じディレクトリへの書き込み権限を付与し、他のユーザーに読み取りと実行の権限のみを付与します。
- sudo chmod 755 /var/sftp
uploads
ディレクトリの所有権をsammyfilesに変更します。
- sudo chown sammyfiles:sammyfiles /var/sftp/uploads
ディレクトリ構造が整ったので、SSHサーバー自体を構成できます。
ステップ3—1つのディレクトリへのアクセスを制限する
このステップでは、SSHサーバー構成を変更して、 sammyfiles のターミナルアクセスを禁止しますが、ファイル転送アクセスは許可します。
nano
またはお好みのテキストエディタを使用して、SSHサーバー構成ファイルを開きます。
- sudo nano /etc/ssh/sshd_config
ファイルの一番下までスクロールして、次の構成スニペットを追加します。
. . .
Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
次に、ファイルを保存して閉じます。
これらの各ディレクティブの機能は次のとおりです。
Match User
は、指定されたユーザーにのみ次のコマンドを適用するようにSSHサーバーに指示します。 ここでは、sammyfilesを指定します。ForceCommand internal-sftp
は、ログイン時にSSHサーバーにSFTPサーバーの実行を強制し、シェルアクセスを禁止します。PasswordAuthentication yes
は、このユーザーのパスワード認証を許可します。ChrootDirectory /var/sftp/
は、ユーザーが/var/sftp
ディレクトリ以外のものへのアクセスを許可されないようにします。AllowAgentForwarding no
、AllowTcpForwarding no
。X11Forwarding no
は、このユーザーのポートフォワーディング、トンネリング、およびX11フォワーディングを無効にします。
Match User
で始まるこの一連のコマンドは、さまざまなユーザーに対してコピーして繰り返すこともできます。 それに応じて、Match User
行のユーザー名を変更してください。
注:PasswordAuthentication yes
行を省略して、代わりにセキュリティを強化するためにSSHキーアクセスを設定できます。 SSH Essentials:SSHサーバー、クライアント、およびキーの操作チュートリアルのパブリックSSHキーのコピーセクションに従ってください。 ユーザーのシェルアクセスを無効にする前に、必ずこれを行ってください。
次のステップでは、パスワードアクセスを使用してローカルでSSHを使用して構成をテストしますが、SSHキーを設定する場合は、代わりにユーザーのキーペアを使用してコンピューターにアクセスする必要があります。
構成の変更を適用するには、サービスを再起動します。
- sudo systemctl restart sshd
これで、sammyfilesに対してのみファイル転送へのアクセスを制限するようにSSHサーバーを構成しました。 最後のステップは、構成をテストして、意図したとおりに機能することを確認することです。
ステップ4—構成の確認
新しいsammyfilesユーザーがファイルのみを転送できることを確認しましょう。
通常のシェルアクセスを使用してsammyfilesとしてサーバーにログインすることはできなくなります。 試してみよう:
- ssh sammyfiles@localhost
元のプロンプトに戻る前に、次のメッセージが表示されます。
Error messageThis service allows sftp connections only.
Connection to localhost closed.
これは、sammyfilesがSSHを使用してサーバーシェルにアクセスできなくなったことを意味します。
次に、ユーザーがファイル転送のためにSFTPに正常にアクセスできるかどうかを確認しましょう。
- sftp sammyfiles@localhost
このコマンドは、エラーメッセージの代わりに、インタラクティブなプロンプトで成功したログインメッセージを表示します。
SFTP promptConnected to localhost.
sftp>
プロンプトでls
を使用して、ディレクトリの内容を一覧表示できます。
- ls
これにより、前の手順で作成したuploads
ディレクトリが表示され、sftp>
プロンプトに戻ります。
SFTP file list outputuploads
ユーザーが実際にこのディレクトリに制限されており、その上のディレクトリにアクセスできないことを確認するには、ディレクトリをその上のディレクトリに変更してみてください。
- cd ..
このコマンドではエラーは発生しませんが、以前のようにディレクトリの内容を一覧表示しても変更は表示されず、ユーザーが親ディレクトリに切り替えることができなかったことが証明されます。
これで、制限された構成が意図したとおりに機能することを確認しました。 新しく作成されたsammyfilesユーザーは、ファイル転送にSFTPプロトコルを使用する場合にのみサーバーにアクセスでき、フルシェルにアクセスすることはできません。
結論
ユーザーをSFTPのみに制限し、完全なシェルアクセスなしでサーバー上の単一のディレクトリにアクセスします。 このチュートリアルでは簡潔にするために1つのディレクトリと1つのユーザーのみを使用しますが、この例を複数のユーザーと複数のディレクトリに拡張できます。
SSHサーバーでは、グループまたは複数のユーザーへのアクセスを一度に制限したり、特定のIPアドレスへのアクセスを制限したりするなど、より複雑な構成スキームを使用できます。 追加の構成オプションの例と可能なディレクティブの説明は、 OpenSSHCookbookにあります。 SSHで問題が発生した場合は、このSSHシリーズのトラブルシューティングを使用してデバッグおよび修正できます。