Ubuntu20.04でシェルアクセスなしでSFTPを有効にする方法
序章
SFTPはS SH F ile T ransfer P rotocolの略で、ファイルを安全に転送する方法です。暗号化されたSSH接続を使用するマシン間。 名前は似ていますが、これは FTP ( F ile T ransfer P rotocol)とは異なるプロトコルですが、SFTPは広くサポートされています最新のFTPクライアントによる。
SFTPはデフォルトで使用可能であり、SSHアクセスが有効になっているすべてのサーバーで追加の構成はありません。 安全で使用はかなり簡単ですが、SFTPの欠点の1つは、標準構成では、SSHサーバーがシステム上のアカウントを持つすべてのユーザーにファイル転送アクセスとターミナルシェルアクセスを許可することです。 多くの場合、ユーザー権限をきめ細かく制御する方が安全です。 たとえば、特定のユーザーにファイル転送のみの実行を許可し、SSH経由でサーバーへのターミナルアクセスを取得できないようにすることができます。
このチュートリアルでは、SSHデーモンを設定して、SFTPアクセスを1つのディレクトリに制限し、ユーザーごとにSSHアクセスを許可しません。
前提条件
このチュートリアルに従うには、Ubuntu20.04サーバーにアクセスする必要があります。 このサーバーには、sudo
権限を持ち、ファイアウォールが有効になっている非rootユーザーが必要です。 これを設定するためのヘルプについては、Ubuntu20.04の初期サーバーセットアップガイドに従ってください。
ステップ1—新しいユーザーを作成する
まず、サーバーへのファイル転送アクセスのみが許可される新しいユーザーを作成します。 ここでは、ユーザー名 sammyfiles を使用していますが、任意のユーザー名を使用できます。
- sudo adduser sammyfiles
アカウントのパスワードを作成するように求められ、続いてユーザーに関する情報が表示されます。 ユーザー情報はオプションであるため、ENTER
を押してこれらのフィールドを空白のままにすることができます。
これで、制限されたディレクトリへのアクセスが許可される新しいユーザーが作成されました。 次のステップでは、ファイル転送用のディレクトリを作成し、必要な権限を設定します。
ステップ2—ファイル転送用のディレクトリを作成する
1つのディレクトリへのSFTPアクセスを制限するには、最初に、ディレクトリがSSHサーバーのアクセス許可要件に準拠していることを確認する必要があります。これは非常に特殊です。
具体的には、ディレクトリ自体と、ファイルシステムツリー内のその前のすべてのディレクトリは、 root が所有している必要があり、他のユーザーが書き込みできないようにする必要があります。 したがって、ホームディレクトリは root ではなくユーザーが所有しているため、ユーザーのホームディレクトリへのアクセスを制限することはできません。
注: OpenSSHの一部のバージョンには、ディレクトリ構造と所有権に関するこのような厳密な要件はありませんが、ほとんどの最新のLinuxディストリビューション(Ubuntu 20.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キーを設定する場合は、ユーザーのキーペアを使用してコンピューターにアクセスする必要があります。
これらの行を追加したら、ファイルを保存して閉じます。 nanoを使用している場合は、CTRL + X
、Y
、ENTER
の順に押すとこれを行うことができます。
構成の変更を適用するには、サービスを再起動します。
- sudo systemctl restart sshd
これで、sammyfilesに対してのみファイル転送へのアクセスを制限するようにSSHサーバーを構成しました。 最後のステップは、構成をテストして、意図したとおりに機能することを確認することです。
ステップ4—構成の確認
新しいsammyfilesユーザーがファイルのみを転送できることを確認しましょう。 前述のように、SFTPはマシン間でファイルを転送するために使用されます。 ローカルマシンとサーバー間の転送をテストすることで、これが機能することを確認できます。
まず、手順1で作成したユーザーとしてサーバーにログインしてみます。 SSH構成ファイルに追加した設定のため、これは不可能です。
- ssh sammyfiles@your_server_ip
元のプロンプトに戻る前に、次のメッセージが表示されます。
- OutputThis service allows sftp connections only.
- Connection to your_server_ip closed.
これは、sammyfilesがSSHを使用してサーバーシェルにアクセスできなくなったことを意味します。
次に、ユーザーがファイル転送のためにSFTPに正常にアクセスできるかどうかを確認します。
- sftp sammyfiles@your_server_ip
エラーメッセージの代わりに、このコマンドはインタラクティブなプロンプトで成功したログインメッセージを生成します:
- OutputConnected to your_server_ip
- sftp>
プロンプトでls
を使用して、ディレクトリの内容を一覧表示できます。
- ls
これにより、前の手順で作成したuploads
ディレクトリが表示され、sftp>
プロンプトに戻ります。
Outputuploads
ユーザーが実際にこのディレクトリに制限されており、それ以前のディレクトリにアクセスできないことを確認するには、ディレクトリを前のディレクトリに変更してみてください。
- cd ..
このコマンドはエラーを発生させませんが、変更なしで以前と同じようにディレクトリの内容を一覧表示し、ユーザーが親ディレクトリに切り替えることができなかったことを証明します。
これで、制限された構成が意図したとおりに機能することを確認しました。 新しく作成されたsammyfilesユーザーは、ファイル転送にSFTPプロトコルを使用する場合にのみサーバーにアクセスでき、フルシェルにアクセスすることはできません。
結論
ユーザーをSFTPのみに制限し、完全なシェルアクセスなしでサーバー上の単一のディレクトリにアクセスします。 このチュートリアルでは簡潔にするために1つのディレクトリと1つのユーザーのみを使用しますが、この例を複数のユーザーと複数のディレクトリに拡張できます。
SSHサーバーでは、グループまたは複数のユーザーへのアクセスを一度に制限したり、特定のIPアドレスへのアクセスを制限したりするなど、さらに複雑な構成スキームを使用できます。 追加の構成オプションの例と可能なディレクティブの説明は、 OpenSSHCookbookにあります。 SSHで問題が発生した場合は、このSSHシリーズのトラブルシューティングを使用してデバッグおよび修正できます。