【RHEL】ユーザーにsudo権限を安全に付与する(/etc/sudoers.d/でのコマンド制限)

RHEL

今回は、RHEL(Red Hat Enterprise Linux)環境でユーザーアカウントにsudo権限を付与する方法について、実務で安全に運用できる手順を詳しく解説します。特に、/etc/sudoers.d/ディレクトリを活用した管理方法と、セキュリティを高めるための特定コマンドのみを許可する設定方法を中心にご紹介します。

システム管理者として、適切な権限管理は非常に重要です。誤った設定はシステム全体のセキュリティリスクにつながるため、正しい知識と手順を身につけましょう。

sudo権限とは?

sudoは「Substitute User DO」の略で、一般ユーザーが一時的に管理者権限(root権限)でコマンドを実行できる仕組みです。常にrootユーザーでログインするのではなく、必要な時だけ権限を昇格させることで、セキュリティを向上させることができます。

RHEL環境では、sudo権限の設定は主に以下の方法で行います:

  • /etc/sudoersファイルの直接編集(非推奨)
  • /etc/sudoers.d/ディレクトリ内にファイルを作成(推奨)

/etc/sudoers.d/を使った基本的な設定方法

なぜ/etc/sudoers.d/を使うのか?

/etc/sudoersファイルを直接編集する方法もありますが、/etc/sudoers.d/ディレクトリを使用することで以下のメリットがあります:

  • ユーザーごとに設定ファイルを分離できる
  • 設定の管理が容易になる
  • システムアップデート時に設定が上書きされるリスクを軽減できる
  • 設定ミスが発生した際に、該当ファイルのみを削除・修正できる

実際の設定手順

ステップ1: rootユーザーまたはsudo権限を持つユーザーでログイン

su -

ステップ2: /etc/sudoers.d/ディレクトリに設定ファイルを作成

visudo -f /etc/sudoers.d/testuser

※ visudoコマンドを使用することで、構文チェックが自動的に行われ、設定ミスを防げます。

-fオプションの意味

  • -f(file)オプション:編集する特定のファイルを指定します
  • 通常、visudoコマンドは/etc/sudoersファイルを編集しますが、-fオプションを付けることで/etc/sudoers.d/配下の個別ファイルを直接編集できます
  • 構文チェック機能は保持されるため、安全に編集作業が行えます

ステップ3: 全権限を付与する場合の記述例

testuser ALL=(ALL) ALL

この設定により、testuserはすべてのコマンドをsudoで実行できるようになります。

ステップ4: パスワード入力を求める設定

セキュリティを保つため、基本的にはパスワード入力を求める設定を推奨します。上記の設定であれば、sudoコマンド実行時に毎回パスワードが求められます。

ステップ5: ファイルのパーミッション確認

chmod 440 /etc/sudoers.d/testuser

sudoers関連ファイルは、適切なパーミッション(440または400)である必要があります。

特定のコマンドのみ許可する方法

実務では、セキュリティの観点から、ユーザーに必要最小限のコマンドのみsudo実行を許可することが重要です。

基本的な記述方法

ユーザー名 ホスト=(実行ユーザー) 許可するコマンド

具体例1: systemctlで特定のサービスのみ操作可能

visudo -f /etc/sudoers.d/appuser
appuser ALL=(ALL) /usr/bin/systemctl restart httpd, /usr/bin/systemctl status httpd

この設定により、appuserはhttpdサービスの再起動と状態確認のみsudoで実行できます。

具体例2: 複数のコマンドをまとめて許可

dbadmin ALL=(ALL) /usr/bin/systemctl restart postgresql, /usr/bin/systemctl stop postgresql, /usr/bin/systemctl start postgresql, /usr/bin/systemctl status postgresql

具体例3: コマンドエイリアスを使った管理

多くのコマンドを許可する場合は、Cmnd_Aliasを使うと管理が楽になります。

Cmnd_Alias WEB_COMMANDS = /usr/bin/systemctl restart httpd, /usr/bin/systemctl restart nginx, /usr/sbin/apachectl
appuser ALL=(ALL) WEB_COMMANDS

パスワード入力を省略する設定(NOPASSWD)

自動化スクリプトなどで使用する場合、NOPASSWDオプションを使うことがあります。ただし、セキュリティリスクが高まるため、慎重に判断してください。

scriptuser ALL=(ALL) NOPASSWD: /usr/local/bin/backup.sh

実務での活用シーン

シーン1: Webアプリケーション運用担当者への権限付与

開発チームやアプリケーション運用担当者に、Webサーバーの再起動権限のみを付与する場合:

webapp_team ALL=(ALL) /usr/bin/systemctl restart httpd, /usr/bin/systemctl status httpd, /usr/bin/systemctl reload httpd

これにより、アプリケーションのデプロイ後に自分でサービスを再起動でき、作業効率が向上します。

シーン2: データベース管理者への限定的な権限付与

DBA(データベース管理者)に、データベース関連の操作のみを許可する場合:

Cmnd_Alias DB_COMMANDS = /usr/bin/systemctl * postgresql, /usr/bin/systemctl * mysql, /usr/pgsql-*/bin/pg_ctl
dba_group ALL=(ALL) DB_COMMANDS

シーン3: 監視ツール用のアカウント設定

Zabbix、Nagiosなどの監視ツール用アカウントに、ログ確認やステータス取得のみを許可:

zabbix ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *, /usr/bin/cat /var/log/messages

シーン4: バックアップ担当者への権限付与

バックアップスクリプトの実行権限のみを付与する場合:

backup_user ALL=(ALL) NOPASSWD: /usr/local/bin/backup.sh, /usr/bin/rsync

よくある失敗例とトラブルシューティング

失敗例1: 構文エラーによるsudo実行不可

症状: sudo実行時に「syntax error」や「parse error」が表示される

原因: /etc/sudoers.d/内のファイルに構文ミスがある

対策:

  • 必ずvisudoコマンドを使用して編集する
  • 直接編集した場合は、以下のコマンドで構文チェック
visudo -c -f /etc/sudoers.d/ファイル名

失敗例2: コマンドのフルパスを指定していない

症状: sudo実行時に「command not found」や権限エラーが発生

原因: sudoers設定ではコマンドのフルパスが必要

対策:

# 誤った例
testuser ALL=(ALL) systemctl restart httpd

# 正しい例
testuser ALL=(ALL) /usr/bin/systemctl restart httpd

コマンドのフルパスはwhichコマンドで確認できます:

which systemctl

失敗例3: ファイル名にドットや特殊文字を含めている

症状: 設定ファイルが読み込まれない

原因: /etc/sudoers.d/内のファイル名に「.」(ドット)や「~」(チルダ)が含まれていると、sudoは無視する仕様

対策:

# 避けるべきファイル名
/etc/sudoers.d/testuser.conf
/etc/sudoers.d/backup~

# 推奨されるファイル名
/etc/sudoers.d/testuser
/etc/sudoers.d/backup_user

失敗例4: パーミッションが不適切

症状: sudoが設定ファイルを読み込まない、またはエラーメッセージが表示される

原因: sudoersファイルのパーミッションが緩すぎる

対策:

chmod 440 /etc/sudoers.d/ファイル名
# または
chmod 400 /etc/sudoers.d/ファイル名

失敗例5: ワイルドカードの不適切な使用

症状: 意図しないコマンドまでsudo実行可能になってしまう

原因: ワイルドカード(*)を使いすぎると、セキュリティホールになる可能性がある

対策:

# 危険な例(すべてのコマンドが実行可能)
testuser ALL=(ALL) /usr/bin/*

# 安全な例(特定のコマンドのみ指定)
testuser ALL=(ALL) /usr/bin/systemctl restart httpd

トラブル時の緊急対応

もしsudoers設定を誤ってしまい、sudo実行ができなくなった場合:

  1. 別の管理者アカウントがあれば、そちらでログイン
  2. rootアカウントで直接ログイン(物理コンソールまたはシングルユーザーモード)
  3. 問題のある設定ファイルを削除または修正
# rootでログイン後
rm /etc/sudoers.d/問題のファイル
# または
visudo -f /etc/sudoers.d/問題のファイル

セキュリティのベストプラクティス

  1. 最小権限の原則: 必要最小限のコマンドのみ許可する
  2. 定期的な見直し: 不要になった権限設定は削除する
  3. ログの監視: /var/log/secureでsudo実行ログを定期的に確認する
  4. パスワード認証の維持: NOPASSWDは本当に必要な場合のみ使用する
  5. ドキュメント化: 誰にどの権限を付与したか記録を残す

まとめ

RHELでのsudo権限管理は、システムセキュリティの基本であり、適切な運用が求められます。/etc/sudoers.d/ディレクトリを活用することで、ユーザーごとの設定を明確に分離でき、管理性が大幅に向上します。

また、特定のコマンドのみを許可する設定により、セキュリティリスクを最小限に抑えながら、各担当者が必要な作業を効率的に実施できる環境を構築できます。

本記事で紹介した基本的な設定方法、実務での活用シーン、よくある失敗例を参考に、安全で効率的なsudo権限管理を実践してください。設定変更時は必ずvisudoコマンドを使用し、構文エラーを防ぐことを忘れないようにしましょう。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

RHELITナレッジ
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました