web-dev-qa-db-ja.com

SSHシェルアクセスを有効にするが、SFTPアクセスを無効にする

私はこの質問に対する実行可能な回答を探しましたが、ほとんどの回答には、なぜそれをしないのかに関するアドバイスが含まれています。ただし、これがシナリオであり、必要なものは次のとおりです。

コンソールアプリがあり、各ユーザーの.profileにアプリの起動コマンドがあり、アプリを起動するコマンドの直後に、システムからログアウトする「exit」コマンドがあります。私は、彼らが提供するインターフェースを介してこのコンソールアプリにアクセスできるようにしたいだけです。アプリは起動時に、アプリを通じてアクセスできるクライアントのリストをユーザーに提示します。各クライアントには独自のデータディレクトリがあります。ユーザーには、アクセスが必要なクライアントのみへのアクセスが許可されます。

ここに問題があります:ユーザーにSSHアクセスを許可すると、SFTPクライアントを使用してログインすることもできます。これにより、アプリのデータディレクトリに直接アクセスできるようになります。これは、彼らはアクセスすべきではないデータディレクトリにアクセスします。

これはtelnet/FTPの組み合わせを使用する場合はとても簡単なことでしたが、インターネット上のどこからでもユーザーにアクセスを許可したいので、SFTPからユーザーを遮断する方法を見つけることができませんでした。それでも、アプリを実行できるシェルへのアクセスを許可します。

21
sosaisapunk

編集:

明らかでない場合、次の回答は、サーバーへのシェルアクセス権を持つユーザーがSFTPを使用できないようにするsecureメソッドとしては意図されていません。それは外部の可視性からそれを無効にする方法を説明する答えにすぎません。ユーザーレベルのセキュリティについては、@ cpastおよび@Aleksi Torhamoからの回答を参照してください。セキュリティに焦点を当てている場合、この答えは適切ではありません。単純なサービスの可視性があなたの焦点である場合、これはあなたの答えです。

私たちは今、元の答えに続きます:


Sshd_configのsftpサポートをコメント化します(そしてもちろんsshdを再起動します):

#Subsystem sftp /usr/lib/openssh/sftp-server

22
Wesley

.profileを使用してこれを実行しないでください。セキュリティがまったく提供されず、まったく何も制限されません!

.profileのようにsshコマンドラインで実行するコマンドを指定するだけでバイパスできるため、ssh user@Host commandに何を入力してもかまいません。 ssh -t user@Host bashを実行すると、通常のシェルアクセスを引き続き取得できます。

別の回答で述べたように、sftpサブシステムを無効にしてもまったく効果がありません。サブシステムは基本的にはコマンドの単なるエイリアスであり、sftp -s /path/to/sftp-executable user@Hostを実行することにより、引き続き通常のsftpを使用できます。

Cpastや一部のコメンターが言ったように、アクセスを制限するための適切なメカニズムを使用する必要があります。あれは、

  • sshd_configForceCommandを使用
  • パスワードなしのログインとcommand="...".ssh/authorized_keysで使用する
  • ユーザーのシェルを、ユーザーが実行できることを制限するものに変更します。

ノート:

  • command="..."は1つのキーにのみ適用されるため、パスワードまたは別のキーを使用するユーザーのsshログインを制限しません
  • ポート転送などを制限することもできます(ポート転送、x11転送、エージェント転送、pty割り当ては私が聞いたことがあるものです)
    • AllowTcpForwardingなど_sshd_config
    • no-port-forwardingなどの.ssh/authorized_keys
  • 他のデーモン(FTPなど)を実行している場合は、それらがユーザーを許可しないことを確認する必要があります(一部のデーモンはユーザーのシェルに基づいてこの決定を行うため、変更する場合は、これを再確認することをお勧めします)。
  • ユーザーのシェルを、必要なことを行うスクリプトに変更できます。引数なしで実行するか、script -c 'command-the-user-wanted-to-run'のように実行します
  • ForceCommandcommand="..."はどちらもユーザーのシェルを介してコマンドを実行するため、ユーザーのシェルがたとえばに設定されている場合は機能しません。 /bin/falseまたは/sbin/nologin

免責事項:私は決してこの問題の専門家ではないので、.profileのことは安全ではないと言えますが、知りません。彼らは私が知る限り安全ですが、インターネットで最初に間違った人になることはありません。

15
Aleksi Torhamo

SSHを有効にしたり、SFTPを無効にしたりすることは、グローバルでもユーザーごとでも可能です。

SSH経由でいくつかのgitリポジトリへのアクセスを許可したいので、個人的にこれが必要です。また、不要なシステムを無効にしたいのです。その場合、SFTPは必要ありません。

世界的に

いくつかの方法で、すべてのユーザーのSFTPを無効にすることができます。

不足しているサブシステム

SSHが使用するSFTPデーモンは、Subsystemキーワードを使用して構成できます。 sshd_config(5)マニュアルから:

_Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.
_

最後の行は、「sftp」のサブシステムを定義しないことで十分であることを示唆しています。

偽りの嘘

SSHが使用するSFTPデーモンを使用できないものに設定することにより、SFTPを無効にすることもできます。たとえば、「sftp」サブシステムを_/bin/false_に構成します。

_Subsystem sftp /bin/false
_

何かがSFTP経由でログインしようとすると、SSHデーモンは「sftpデーモン」_/bin/false_を生成しようとします。 _/bin/false_プログラムは1つの処理のみを実行し、エラーコードを返します。 SFTP接続の試行は事実上拒否されます。

ユーザー/グループごと

ユーザー、グループ、またはその他のいくつかの基準ごとにSFTPを無効にすることもできます。

これは、ユーザーに通常のシェルプロンプトを表示させたい場合には機能しません。シェルアクセスがあれば、ほとんどのものを回避できるため、意味がありません。 特定のプログラムへのアクセスのみを許可する場合にのみ機能します。

マッチング

一連のユーザーに一致させるには、Matchキーワードを使用してSSHを構成できます。 sshd_config(5)マニュアルから:

_Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...
_

いくつかの例:

  • _Match User eva_は「eva」ユーザーに一致します
  • _Match User stephen,maria_は、「stephen」および「maria」ユーザーに一致します
  • _Match Group wheel,adams,simpsons_は、「wheel」、「adams」、「simpsons」グループに一致します

さらに情報が必要な場合は、sshd_config(5)マニュアルにロードがあります。

強制コマンド

通常、SSH経由で接続するときにユーザーのログインシェルを取得しますが、SSHは特定のコマンドを強制するように構成できます。コマンドは、SFTPを含むすべてのSSH接続に対して強制されるため、必要なコマンドを強制するオプションがある場合があります。

強制するコマンドは、ForceCommandキーワードを使用して構成できます。 sshd_config(5)マニュアルから:

_ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login Shell
        with the -c option.  This applies to Shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.
_

したがって、_ForceCommand <your command>_を使用して、必要な制約コマンドを強制できます。例えば:

_Match User kim
        ForceCommand echo 'successful login man, congrats'
_

Gitにアクセスを許可する場合、ユーザーには_git-Shell_へのアクセス権のみが必要です。これは、いくつかのセキュリティオプションとともに、私のgitユーザーに対してSFTPを無効にするセクションです。

_Match Group git

        # have to do this instead of setting the login Shell to `git-Shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-Shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no
_
1
aude