コンテンツにスキップ

Sudo

出典: フリー教科書『ウィキブックス(Wikibooks)』

sudo は、幅広いUnix系システムやmacOS、Linuxディストリビューションにおいて、一般ユーザーが管理者権限(root権限)で操作を行うためのコマンドラインツールです。セキュリティを保ちながら、必要な権限を必要なユーザーに付与することができます。本書では、sudoの設定方法や使用方法について詳しく解説します。

sudoの概要

[編集]

sudoは、Unix系システムで広く使用されている権限昇格ツールです。管理者はsudoersファイルを通じて、特定のユーザーやグループに対して、特定のコマンドを実行する権限を詳細に設定することができます。sudoは、各コマンドの実行履歴を記録し、セキュリティ監査にも役立ちます。

歴史

[編集]

sudoは1980年頃、ニューヨーク州立大学バッファロー校(SUNY Buffalo)のRobert CoggeshallとCliff Spencerによって開発されました。その後、Robert Coggeshallがコロラド大学ボルダー校に移った際に持ち込まれ、1986年から1993年にかけて同大学のITスタッフによってコードや機能が大幅に改良されました。この時期、Todd C. Millerも開発に関与しています。

1994年以降、OpenBSDの開発者であるTodd C. Millerによって、現在のバージョンが公開保守されています。1999年には、ISCスタイルのライセンスで配布が開始されました。

2024年2月には、MicrosoftがWindows向けのsudoをリリースし、Unixと同様に昇格した権限でコマンドを実行する機能を提供しています。このリリースにより、Windows環境でも標準的にsudoが利用可能となりました。

さらに、OpenBSD 5.8以降(2015年10月)、sudoに代わるシンプルな特権昇格ツールとしてdoasが導入されています。一方で、sudoも引き続きポートとして利用可能です。

インストール

[編集]

sudoは、Unixのベースシステムにはないので、必要に応じて以下の方法でインストールできます。

FreeBSD

[編集]

FreeBSDでは、以下のいずれかの方法でインストールできます。

# pkg install sudo

または、Portsから:

# make -C /usr/ports/security/sudo install clean

OpenBSD

[編集]

OpenBSDでは、デフォルトでインストールされていませんが、以下のコマンドでインストールできます。

# pkg_add sudo

ただし OpenBSD のベースシステムには doas が含まれているので、あえて sudo を使う理由は特にありません。

NetBSD

[編集]

NetBSDでは、pkgsrcを使用してインストールします。

# pkg_add sudo

または、Pkgsrcから:

# make -C /usr/ports/security/sudo install clean

Debian/Ubuntu系

[編集]

Debian/Ubuntu系のシステムでは既にインストールされていますが、以下のコマンドでインストールできます。

# apt-get install sudo

Red Hat系

[編集]

Red Hat系(RHEL、CentOS、Fedora)では既にインストールされていますが、、以下のコマンドでインストールします。

# dnf install sudo

macOS

[編集]

macOSでは、sudoはデフォルトでインストールされていますが、最新バージョンをインストールするにはHomebrewを利用します。

# brew install sudo

Windows

[編集]

Windows向けに公式のsudoがリリースされています。wingetを使用してインストールできます。

PS> winget install sudo

sudoersファイルの設定

[編集]

sudoersは、sudoの設定ファイルで、ユーザーやグループの権限を定義します。このファイルは必ずvisudoコマンドを使って編集する必要があります。

基本的な設定例

[編集]

sudoersファイルは通常/etc/sudoersにあります。以下は基本的な設定例です。

# rootユーザーにすべての権限を付与
root    ALL=(ALL:ALL) ALL

# wheelグループのメンバーにすべての権限を付与
%wheel  ALL=(ALL:ALL) ALL

# 特定のユーザーにパスワードなしで特定のコマンドを許可
username ALL=(ALL) NOPASSWD: /usr/bin/apt-get update

# 特定のグループに特定のコマンドのみを許可
%developers ALL=(ALL) /usr/bin/git, /usr/bin/docker

設定項目の解説

[編集]
  • ユーザー指定: どのユーザーに権限を与えるかを指定します。
  • ホスト指定: どのホストでコマンドを実行できるかを指定します。
  • 実行ユーザー指定: どのユーザーとしてコマンドを実行できるかを指定します。
  • コマンド指定: 実行を許可するコマンドを指定します。

sudoの使用方法

[編集]

sudoを使用してコマンドを実行するには、次のような構文を使用します。

sudo [オプション] コマンド

主要なオプション

[編集]
  • -u user: 指定したユーザーとしてコマンドを実行
  • -i: ログインシェルをシミュレート
  • -s: シェルを起動
  • -l: 許可されているコマンドを表示
  • -v: タイムスタンプを更新(パスワードキャッシュの延長)

使用例

[編集]

システムの更新を行う場合:

sudo apt-get update

特定のユーザーとしてコマンドを実行:

sudo -u postgres psql

セキュリティ設定

[編集]

sudoのセキュリティを強化するために、以下の点に注意してください:

基本的なセキュリティ設定

[編集]
  • 最小権限の原則: ユーザーには必要最小限の権限のみを付与
  • パスワードタイムアウト: timestamp_timeoutの適切な設定
  • ログ記録: すべてのsudoコマンドの実行を記録
  • パスワードポリシー: 強力なパスワードの要求

推奨設定

[編集]
# パスワード試行回数を制限
Defaults passwd_tries=3

# sudoセッションのタイムアウトを設定
Defaults timestamp_timeout=5

# パスワード入力を要求
Defaults !visiblepw

# ログ設定
Defaults syslog=auth
Defaults logfile=/var/log/sudo.log

トラブルシューティング

[編集]

sudoに関する一般的な問題と解決方法:

一般的な問題

[編集]
  1. 権限エラー: sudoersファイルの設定を確認
  2. パスワード関連の問題: タイムスタンプの設定を確認
  3. コマンドパス問題: secure_pathの設定を確認

デバッグ方法

[編集]
  • sudo -lで現在の権限を確認
  • visudo -cで設定ファイルの構文チェック
  • ログファイル(/var/log/auth.logなど)の確認
過去に発生した sudo に関連するセキュリティ問題
CVE 脆弱性名 発見年 詳細
CVE-2019-14287 特権エスカレーション脆弱性 2019 特定の条件下で sudo を使用すると、ユーザーが許可されていないコマンドを root 権限で実行できる問題。
CVE-2021-3156 バッファオーバーフロー脆弱性 2021 sudo の引数処理でヒープバッファオーバーフローが発生する問題。未認証のユーザーが root 権限を取得できる可能性。
CVE-2017-1000367 権限分離の不適切な実装 2017 特定のコンパイルオプションでビルドされた sudo がセッションプラグインを正しく処理せず、エスカレーションが可能となる問題。
CVE-2014-0106 環境変数の検証不足 2014 sudo の環境変数により意図しないコード実行が可能になる問題。
CVE-2012-0809 ターミナルチェックの不備 2012 sudo 実行時にターミナルがアクティブでない場合に特定の操作でセキュリティ制約を回避できる問題。
これらの脆弱性は、特権エスカレーションや任意コード実行などの深刻な問題を引き起こしうるため、迅速なパッチ適用が推奨されました。

doasとの比較

[編集]

sudoは広く使われているツールですが、doasへの移行を検討する理由がいくつかあります:

doasを選択する理由

[編集]
  • コードベースの大きさ
    • sudoは約10万行のコードで構成されており、潜在的な脆弱性の可能性が高くなります
    • doasは約1,000行程度のコードで、監査やバグ発見が容易です
  • 設定の単純さ
    • sudoersの文法は複雑で、設定ミスを起こしやすい
    • doasの設定は直感的で単純な文法を採用しており、誤設定のリスクが低い
      # sudoersの例
      user    ALL=(ALL:ALL) ALL
      # doasの例
      permit user as root
      
  • セキュリティ上の利点
    • sudoは機能が多いため、攻撃対象となる表面積が大きい
    • doasはミニマルな設計で、セキュリティリスクが低減される
    • sudoでは過去に深刻な脆弱性が複数報告されている(例:Baron Samedit脆弱性)
  • メンテナンス性
    • sudoは複雑な機能を多く持つため、設定の管理が煩雑
    • doasはシンプルな設計のため、システム管理者の負担が少ない
  • パフォーマンス
    • doasは軽量で、システムリソースの消費が少ない
    • sudoは機能が豊富な分、より多くのリソースを使用する

sudoを継続使用する理由

[編集]

ただし、以下の場合はsudoの使用を継続する価値があります:

  • 詳細な権限制御が必要な場合
    • 複雑なアクセス制御ルールが要求される環境
    • 時間帯による制限など、高度な制御が必要な場合
  • 監査要件が厳しい環境
    • 詳細なログ記録が必要な場合
    • コマンド実行の詳細な追跡が求められる場合
  • 既存システムとの統合
    • 既存のsudo設定が複雑で移行コストが高い場合
    • サードパーティ製のツールがsudoに依存している場合

移行の検討

[編集]

doasへの移行を検討する際は、以下の点を考慮してください:

  • システムの規模
    • 小規模なシステムではdoasへの移行が容易
    • 大規模システムでは慎重な移行計画が必要
  • ユーザーの習熟度
    • doasの方がコマンド体系が単純で学習が容易
    • ただし、sudoに慣れたユーザーの再教育が必要
  • セキュリティポリシー
    • 組織のセキュリティ要件にdoasが適合するか確認
    • 必要なセキュリティ機能がdoasで提供されているか検証