4 ポイント 投稿者 GN⁺ 2024-06-24 | 1件のコメント | WhatsAppで共有

目標

  • 権限を持つユーザーだけが root 権限でコマンドを実行できるようにする
  • 権限昇格を使用しない

実装

  • 専用の SSH キーを生成し、root 認証に使用する

    mkdir /root/.ssh/
    echo ssh-ed25519 AAAAC3Nza... > /root/.ssh/local_keys
    
  • Unix ドメインソケットにバインドされた sshd サーバーインスタンスを実行する

    mkdir /run/sshd/
    chown root:wheel /run/sshd/
    chmod 750 /run/sshd/
    s6-ipcserver /run/sshd/sshd.sock sshd -ie -o AuthorizedKeysFile=/root/.ssh/local_keys -o PermitRootLogin=yes
    
  • root アカウントをロックし、パスワードではログインできないように設定する

    # /etc/passwd ファイルで root パスワードを変更
    
  • ローカルの sshd インスタンスに接続するために ProxyCommand オプションを使用する

    ssh -o ProxyCommand='socat STDIO UNIX-CONNECT:/run/sshd/sshd.sock' \
        -i .ssh/root-key.pub \
        -t \
        root@root \
        "cd $(pwd); '$SHELL' --login"
    
  • ProxyUseFdpass オプションを使用してソケットファイルディスクリプタを渡すスクリプトを作成する

    #!/usr/bin/env python3
    import sys
    import socket
    import array
    
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.connect("/run/sshd/sshd.sock")
    
    fds = array.array("i", [s.fileno()])
    ancdata = [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]
    socket.socket(fileno=1).sendmsg([b'\0'], ancdata)
    
  • 最後に ssh コマンドを実行する

    ssh -o ProxyCommand='/home/hugo/tmp/passfd.py' \
        -i .ssh/root-key.pub \
        -o ProxyUseFdpass=yes \
        -t \
        root@root \
        "cd $(pwd); '$SHELL' --login"
    

結論

  • この技術は OpenSSH を使ってセキュリティの詳細を処理する
  • ハードウェアベースの SSH キーを含むさまざまな認証方法をサポートする
  • 新しいホストへの設定作業はそれほど複雑ではない
  • passfd.py スクリプトは実験のための一時的な回避策であり、日常的に使うなら小さな実行ファイルとして作成するのが望ましい

GN⁺ の意見

  • この方法は sudodoas の代替としてセキュリティを高められる
  • SSH を使って認証を強化するアプローチは、ハードウェアベース認証を含む多様な認証方法をサポートする
  • システム設定が比較的簡単なので、初級エンジニアでも容易に試せる
  • passfd.py スクリプトを小さな実行ファイルにして /usr/local/bin に配置すれば、より便利に使える
  • この方法はネットワークに露出せずローカルでのみ動作するため、セキュリティが高い

1件のコメント

 
GN⁺ 2024-06-24
Hacker Newsの意見
  • 複雑さの増大: 既存の単一のsuidバイナリの代わりに、rootとして実行されるバイナリとUNIXソケットを使う2つのバイナリが必要になる。これは、非対称暗号処理を含めて複雑さを増す。

  • システムセキュリティ: sudoバイナリを特定のグループ(wheel)に制限し、権限を調整すれば、sshdアプローチと同様のセキュリティ水準を維持できる。システムのパッケージ管理者がsudo権限を壊してしまう場合は、cronで定期的に修正したり、sudoをソースから直接インストールしたりする方法もある。

  • systemdのrun0: systemdのrun0ツールはsudoと似たように動作するが、SUIDではない。代わりに、サービスマネージャーにコマンドの実行を依頼する。これはsshにより近い動作を示す。

  • sshとsudoの比較: ssh経由でrootとしてログインすることが、sudoより本当に安全なのかは疑問。sshdへのリモートユーザーアクセスをどう防ぐかについて議論が必要だ。sudoの制限と比べると、sshアプローチのほうが脆弱かもしれない。

  • ネットワークサービスの問題: sshが起動時に開始されなければ、コンソールログインもできなくなる。これはsudoやsuよりも大きな問題を引き起こしかねない。

  • systemd run0に似たアプローチ: systemdのrun0ツールに似たアプローチがある。

  • sudoの細かな制御: sudoはコマンドや引数、サブシェルの生成などを細かく制御できる。新しいアプローチではこうした細かな制御が失われ、信頼できる鍵管理もより難しくなる。

  • SSHコンソール設定: 専用のSSHコンソールを使ってrootアクセスを管理する方法。YubiKeyとファイアウォール設定でセキュリティを強化する。

  • SSHプロトコルの限界: SSHではプロセス生成がプロトコルの一部ではなく、ローカルリソースを子プロセスに渡すこともできない。sudoの代替として使うには、POSIX spawnに似た拡張が必要になる。

  • ユーザー管理: ユーザーを子ども扱いせず、合理的なデフォルトを設定して潜在的な問題を避けることが重要だ。rootアクセスが必要なら、コンソール経由でログインするのが望ましい。

  • シングルユーザーモードの問題: シングルユーザーモードでrootとしてログインできないと、システム復旧が難しくなる。これはシステムアップグレード中に発生しうる問題を解決するために必要だ。