はじめに (対象読者・この記事でわかること)

この記事は、Ubuntu 20.04 LTS環境において、標準ユーザーが不用意にシステム全体に影響を与える操作(例えば、重要な設定ファイルの変更、パッケージのインストール・削除、他のユーザーの管理など)を実行できないように、操作権限を制限したいと考えているシステム管理者や開発者の方々を対象としています。

この記事を読むことで、以下のことがわかるようになります。

  • sudo コマンドの仕組みと、それをどのように制限するか。
  • sudoers ファイルの安全な編集方法 (visudo の使用)。
  • 特定のコマンドや操作のみを許可・拒否する方法。
  • ユーザーを特定のグループに所属させ、そのグループの権限を管理する方法。
  • 標準ユーザーによる不要な操作を防ぎ、システム全体のセキュリティと安定性を向上させるための具体的な設定手順。

VPSやクラウド環境で、複数人でサーバーを管理する際や、開発環境の安全性を高めたい場合に役立つ知識を提供します。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Ubuntu 20.04 LTSの基本的な操作(ターミナルでのコマンド実行など)
  • Linuxのファイルパーミッションの基本的な概念
  • ユーザーアカウントとグループの概念

Ubuntu 20.04における標準ユーザーの操作制限の必要性

サーバー環境において、root権限やそれに準ずる管理者権限を持つユーザー(通常はsudoコマンドで権限昇格したユーザー)は、システム全体に対して非常に強力な操作を行うことができます。しかし、標準ユーザーに無制限にこれらの権限を与えてしまうと、意図しない設定変更、誤ったコマンド実行によるシステム障害、悪意のあるソフトウェアのインストール、あるいは他のユーザーのデータへのアクセスなど、深刻なセキュリティリスクや運用上の問題を引き起こす可能性があります。

特に、以下のような状況で標準ユーザーの操作制限は重要になります。

  • 共有サーバー環境: 複数の開発者やユーザーが同じサーバーにアクセスする場合、互いの作業環境に影響を与えたり、システム全体を不安定にしたりしないように、権限を適切に分離する必要があります。
  • 開発環境: 開発者がアプリケーションのデプロイやミドルウェアの管理を行う際、システム全体への影響を最小限に抑え、開発に不要な操作は制限したい場合があります。
  • セキュリティ強化: 最小権限の原則(Principle of Least Privilege)に基づき、ユーザーにはその業務遂行に必要な最小限の権限のみを付与することが、セキュリティインシデントのリスクを低減させます。

Ubuntu 20.04では、sudoコマンドとsudoersファイル、そしてグループ管理を組み合わせることで、これらの操作制限を柔軟かつ効果的に実現できます。

sudoersファイルによる操作権限の細やかな制御

sudo (Superuser Do) は、許可されたユーザーが他のユーザー(通常はroot)としてコマンドを実行できるようにするプログラムです。sudoersファイルは、どのユーザーがどのコマンドを、どのホストから、どのような条件で実行できるかを定義する設定ファイルです。このファイルを適切に編集することで、標準ユーザーの操作を細かく制御できます。

sudoersファイルの安全な編集方法:visudo

sudoersファイルを直接テキストエディタで編集することは、構文エラーがあった場合にsudoコマンド自体が機能しなくなり、システムが操作不能になるリスクがあるため推奨されません。代わりに、visudoコマンドを使用します。visudoは、sudoersファイルを編集する際に構文チェックを行い、エラーがあれば保存前に警告してくれるため、安全に編集できます。

  1. visudoの実行: ターミナルを開き、以下のコマンドを実行します。 bash sudo visudo これにより、デフォルトのテキストエディタ(通常はnanoまたはvim)で/etc/sudoersファイルが開かれます。

  2. sudoersファイルの基本構文: sudoersファイルは、以下のような構文で記述されます。

    ``` User_Alias newcommands = /path/to/command1, /path/to/command2

    ユーザー名 host=(runas_user) :

    username ALL=(ALL:ALL) ALL

    特定のユーザーに特定のコマンドのみ実行を許可

    username ALL=(ALL) /usr/bin/apt update, /usr/bin/apt list ```

    • User_Alias: 複数のユーザーやグループをまとめてエイリアスとして定義できます。
    • host: コマンドを実行できるホストを指定します(通常はALL)。
    • (runas_user): コマンドを実行する際のユーザーを指定します(通常はALLとしてroot権限を意味します)。
    • <commands>: 許可または拒否するコマンドのパスを指定します。
  3. 標準ユーザーの操作を制限する設定例:

    • 全てのsudo権限を剥奪する: もし、あるユーザーにsudo権限を一切与えたくない場合は、そのユーザーのsudoersエントリを削除するか、以下のように記述します(ただし、sudoグループに所属している場合は、そちらの権限が優先されることがあります)。

      ```

      ユーザー 'limiteduser' から sudo 権限を削除(あるいは何もしない)

      limiteduser ALL=(ALL) NOPASSWD: ALL ← これは全権限許可なので注意

      NOPASSWD を付けずに、あるいはエントリ自体を削除するのが一般的

      `` より確実なのは、/etc/sudoers.d/` ディレクトリにファイルを作成し、そこで明示的に権限を制限することです。

    • 特定のコマンドのみ実行を許可する: 標準ユーザーuser1に、パッケージリストの更新 (apt update) とパッケージの確認 (apt list) のみsudo権限で実行できるようにする場合。

      まず、/etc/sudoers.d/ ディレクトリに新しいファイルを作成します。 bash sudo visudo -f /etc/sudoers.d/user1_commands ファイルに以下を記述します。 user1 ALL=(ALL) /usr/bin/apt update, /usr/bin/apt list これにより、user1sudo apt updatesudo apt listは実行できますが、sudo apt upgradesudo apt installなどは実行できなくなります。

    • 特定のコマンドの実行を禁止する: sudoersファイルでは、コマンドの実行を許可するだけでなく、特定のコマンドの実行を禁止することも可能です。これは、ALLの後に!をつけて、禁止したいコマンドを指定することで実現します。

      例えば、user2にほとんどのsudo権限を許可するが、rm -rf / のような危険なコマンドを禁止したい場合。 bash sudo visudo -f /etc/sudoers.d/user2_safe ファイルに以下を記述します。 user2 ALL=(ALL) ALL, !/bin/rm -rf この設定では、user2ALL(全てのコマンド)を実行できますが、rm -rfコマンドの実行は禁止されます。

    • NOPASSWDオプション: NOPASSWD: オプションを付けると、コマンド実行時にパスワード入力を省略できます。これは利便性が向上しますが、セキュリティリスクも伴うため、慎重に使用してください。

      user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myservice この設定では、user1sudo systemctl restart myserviceをパスワードなしで実行できます。

グループ管理による権限の集約

ユーザーごとにsudoersファイルを個別に設定するのは、ユーザー数が多い場合に管理が煩雑になります。このような場合は、グループを活用して権限を管理するのが効果的です。

Ubuntuでは、sudoグループのメンバーはデフォルトでsudoコマンドによる管理者権限の昇格が許可されています。このグループのメンバーシップを管理することで、間接的に権限を制御できます。

  1. 既存のグループの確認: 現在定義されているグループを確認するには、/etc/groupファイルを確認するか、getent groupコマンドを使用します。 bash getent group sudo

  2. ユーザーをグループに追加・削除する: ユーザーを特定のグループに追加するには、usermodコマンドを使用します。

    • ユーザーをsudoグループに追加する(管理者権限を付与する): bash sudo usermod -aG sudo <username> -a は既存のグループに追加するオプション、-G は追加するグループを指定します。

    • ユーザーをsudoグループから削除する(管理者権限を剥奪する): bash sudo gpasswd -d <username> sudo または、usermodで他のグループのみに所属させることもできます。

  3. カスタムグループの作成と権限設定: より細やかな権限管理のために、独自のグループを作成し、sudoersファイルでそのグループに特定の権限を付与する方法があります。

    • カスタムグループの作成: bash sudo groupadd webadmin

    • ユーザーをカスタムグループに追加: bash sudo usermod -aG webadmin <username>

    • sudoersファイルでカスタムグループに権限を付与: bash sudo visudo -f /etc/sudoers.d/webadmin_group ファイルに以下を記述します。 %webadmin ALL=(ALL) /usr/sbin/service apache2 restart, /usr/sbin/service apache2 stop, /usr/sbin/service apache2 start %記号はグループを表します。この設定により、webadminグループのメンバーは、Apacheの再起動、停止、開始コマンドのみをsudo権限で実行できるようになります。

ハマった点やエラー解決

  • visudoで構文エラーが発生し、保存できない: visudoは編集の最後に構文チェックを行います。エラーがあった場合は、画面にエラーメッセージが表示され、保存せずに終了するか、修正してから保存するかを選択できます。エラーメッセージをよく読み、スペルミスや括弧の閉じ忘れ、カンマの抜けがないかなどを確認してください。 もし、どうしても原因がわからない場合や、sudoersファイルが破損してしまった場合は、Ubuntuのリカバリーモードで起動し、/etc/sudoersファイルを修正する必要があります。

  • 設定した権限が反映されない: ユーザーがログアウトしてから再度ログインし直す必要があります。グループの変更は、新しくログインしたセッションから有効になります。

  • 期待しないコマンドが実行できてしまう: sudoersファイルの設定は、上から順に評価されるわけではなく、より具体的な設定が優先される場合があります。また、ALLで許可されている設定が、後続のより限定的な設定を上書きしてしまうこともあります。設定はシンプルに保ち、必要最低限の権限のみを付与するように心がけてください。

  • /etc/sudoers.d/ ディレクトリのパーミッション: /etc/sudoers.d/ ディレクトリ自体と、その中のファイルは、rootのみが読み取り可能であり、パーミッションは0440 (dr-xr-xr-x) または 0400 (r--r--r--) に設定されている必要があります。visudoコマンドで作成・編集すれば、通常は自動的に適切なパーミッションが設定されます。

まとめ

本記事では、Ubuntu 20.04 LTS環境において、標準ユーザーの操作権限を安全かつ効果的に制限する方法について解説しました。

  • sudosudoersファイルの役割を理解し、visudoコマンドを用いて安全に設定ファイルを編集する方法を学びました。
  • 特定のコマンドのみを許可・禁止する細やかな権限設定の具体例を示しました。
  • グループ管理を活用することで、ユーザー権限の集約と効率的な管理が可能になることを確認しました。
  • 設定時の注意点や、よくあるエラーとその解決策についても触れました。

これらの設定を適切に行うことで、システム管理者は標準ユーザーの不用意な操作によるリスクを低減し、サーバーのセキュリティと安定性を大幅に向上させることができます。

今後は、sudoersファイルを使ったより高度な設定(時間帯による権限制限など)や、PAM (Pluggable Authentication Modules) を利用した認証メカニズムのカスタマイズなども、さらに理解を深めていくことをお勧めします。

参考資料