- root権限は完全な制御権限を与えるが、Ubuntuなどのディストリビューションではリスクを軽減するためにデフォルトで無効になっている。
- sudoを使うと、状況に応じて権限を昇格させることができ、各コマンドを実行したユーザーの記録も残ります。
- グラフィカルアプリケーションの場合、.desktopランチャーで使用できるkdesu、gksu、gksudo、pkexecなどのヘルパーがあります。
- セキュリティは、最小権限の原則を守り、信頼できないスクリプトを避け、昇格されたアクセスを監査することによって確保されます。

Windowsでは、スタートメニューからShift+EnterキーまたはShift+左クリックを押すと、管理者権限でプログラムを開くのが一般的です。Linuxでは、セキュリティがroot、sudo、グラフィカルヘルパーに依存しているため、必ずしも簡単ではありません。また、各デスクトップ環境には独自のツールがあります。それでも、ランチャー、ショートカット、またはアプリケーションメニューからroot権限でアプリケーションを起動する比較的簡単な方法はありますが、その操作がどのような結果を招くかを理解しておくことが重要です。
重要なのは、rootユーザーがシステムを完全に制御できる点です。そして、最新のディストリビューション、特にUbuntuとその派生ディストリビューションでは、通常、直接ログインが無効になっています。そのため、rootとしてログインすることは一般的ではなく、`sudo`コマンドやパスワード入力を求めるグラフィカルプログラムを使って、必要に応じて権限を昇格させるのが一般的です。ランチャーアイコンからこれらの権限でアプリを起動させたい場合は、実行するコマンドを変更するか、専用のランチャーを作成する必要があります。
何かをroot権限で実行するとは、実際にはどういう意味なのでしょうか?

Linuxでは、rootはUID 0を持ち、無制限の権限を持つアカウントです。rootは、あらゆるファイルの読み取り、変更、削除、ソフトウェアのインストール、カーネル設定の変更、あらゆるユーザーに属するプロセスの制御を行うことができます。そのため、非常に強力なツールであると同時に、不用意に使用すると大きなリスクにもなります。`rm`や`mv`コマンドの入力ミスでシステムが使用不能になる可能性があり、root権限で悪意のあるスクリプトを実行すれば、バックドアのインストール、セキュリティ対策の変更、データの窃盗などを痕跡をほとんど残さずに実行できてしまいます。
Ubuntuでは、rootアカウントにデフォルトのパスワードはなく、直接ログインは許可されていません。基本的な考え方は、通常のユーザーアカウントで作業を行い、特定のタスクには`sudo`を使用するというものです。`sudo`とは、基本的に、`sudo`グループに属している場合は自分のパスワードで認証した後、別のユーザー(通常はroot)としてコマンドを実行することを意味します。これにより、ユーザーが危険にさらされる時間を制限し、誰が何をしたかの記録を残すことができます。
ただし、破損したシステムの復旧、制限された環境での作業、永続的なアクセスを必要とするサービスの構成など、非常に特殊な状況では、一時的にroot権限を有効にすることを検討してもよいでしょう。一般的には、必要が生じたらすぐにroot権限を無効にすることをお勧めします。root権限で作業する時間が短いほど、マシンの安定性とセキュリティが向上します。
ルート権限を無用で使用することのリスク
最も明白な危険の一つは、重要なファイルを誤って削除してしまうことです。root権限では権限制限がないため、`sudo rm -rf /`のようなコマンドを実行すると、警告なしにシステムが消去されてしまいます。また、これらの削除されたファイルは通常ごみ箱に保存されないため、復旧には複雑なフォレンジックツールや、場合によってはシステム全体の再インストールが必要になることもあります。
もう一つのリスクは、信頼できないスクリプトを実行することです。任意のサイトからダウンロードしたコードを管理者権限で実行すると、事実上、そのスクリプトに自分のシステムの鍵を渡してしまうことになります。スクリプトが無害に見えても、破壊的な命令が含まれていたり、ルート権限でマルウェアをインストールしたりする可能性があります。そのため、本番環境で実行する前に、コードを精査し、公式の情報源を利用し、チェックサムを確認し、仮想マシンやコンテナでテストすることをお勧めします。
追跡可能性にも問題があります。`sudo` を使用すると、システムはコマンド、実行したユーザー、および時刻を`/var/log/auth.log`、`/var/log/secure`、または `journalctl`にログ記録します。root として直接ログインすると、すべてが root として表示され、各変更を誰が行ったのかが分からなくなります。複数の管理者がいる環境や、ISO 27001、PCI DSS、その他の監査基準が適用される環境では、この追跡可能性の欠如は重大な弱点となります。
端末から権限を取得する方法

最も一般的で推奨される方法は、特定のコマンドの前に `sudo` を付けることです。たとえば、パッケージの更新、サービスの再起動、保護されたファイルの編集を行う場合、`sudo` はルートパスワードではなくユーザーパスワードを要求し、認証後、管理者権限でコマンドを実行します。別のユーザーとして実行する必要がある場合は、`sudo -u ユーザー名 コマンド` を使用できます。また、`sudo` を付け忘れたことに気づいた場合は、最後のコマンドを`sudo !! `を付けて再度実行できます。
複数の管理タスクを連続して実行する場合、一時的なルートシェルを開くと便利です。`sudo -i`は完全なルートログインをシミュレートし、ルート環境をロードして、ホームディレクトリに移動します。`sudo su`または`sudo su -`も機能しますが、通常は `sudo -i` の方が信頼性が高いです。このセッションを終了するには、単に `exit` と入力します。ルートシェルを開いたまま放置することは推奨されません。
一方、`su` コマンドはユーザーを切り替えます。`su - root`または単に`su -`は対象ユーザーの環境変数を引き継ぎますが、`su root`またはハイフンなしの `su` は以前の環境の一部を保持します。この違いにより、`command not found` のようなエラーが発生します。管理コマンドは通常 `/usr/local/sbin`、`/usr/sbin`、`/sbin` にありますが、これらのパスは一般ユーザーの PATH に必ずしも含まれているとは限りません。ハイフンなしの `su` を使用する場合は、フルパスを入力するか、`su -` に切り替えて root PATH を継承する必要があります。
root にパスワードを設定する場合は、`sudo passwd root`を使用します。Ubuntu では推奨されていませんが、技術的には root にパスワードを設定することは可能です。アカウントをロックするには`sudo passwd -l root`を使用し、ロックを解除するには `sudo passwd -u root` を使用します。SSH では、直接 root アクセスは`/etc/ssh/sshd_config` の`PermitRootLogin`によって制御されます。最も安全な設定は `no` にするか、最大でも SSH パスワードのみを許可する `prohibit-password` に設定することです。その後、SSH サービスを再起動する必要があります。
セーターを正確に構成する
`/etc/sudoers`ファイルは、誰が `sudo` を使用できるか、またその目的を定義します。このファイルを直接編集するのは避けるべきです。正しい方法は`sudo visudo`を使用することです。`sudo visudo` はファイルをロックし、保存前に構文チェックを行います。基本的なルールは `host user=(target_user)` の形式です。例えば、`bob ALL=(ALL) ALL` は、`bob` がどのマシンでも root 権限で任意のコマンドを実行できるようにします。グループも使用できます。例えば、`%admin ALL=(ALL) ALL` のようにです。
より細かい権限を付与するために、エイリアスが使用されます。`User_Alias ADMINS = alice, bob` はユーザーをグループ化し、`Cmnd_Alias LOCATE = /usr/sbin/updatedb` はコマンドをグループ化します。次に、`ADMINS ALL = LOCATE` を使用することで、これらのユーザーは指定されたコマンドのみを実行できるようになります。`route`、`ifconfig`、`ping`、`iptables` などのコマンドに対して、`NETWORKING` のようなエイリアスを作成できます。これにより、誰にも完全なルートアクセス権限を与えることなく、最小権限の原則を適用できます。
NOPASSWDオプションを使用すると、例えば `pi ALL=(ALL)` のように、特定のコマンドをパスワードなしで実行できます。NOPASSWD: ALL。これは便利ですが、悪用すると危険です。さらに、`sudo` の使用はすべてログに記録されるため、アクセス状況の監査や問題のトラブルシューティングに役立ちます。何か問題が発生した場合、これらのログを確認することで、最近のどの変更が障害の原因となったかを特定できます。
ランチャーからroot権限でグラフィカルアプリケーションを起動する

グラフィカルインターフェースを備えたプログラムの場合、単に `sudo` を使用するだけでは、パスワードの入力を求めるターミナルがないため、通常はうまく機能しません。ここでグラフィカルヘルパーの出番です。KDE には`kdesu`があります。アプリケーションを起動するコマンドがわかっている場合は、`kdesu that_command` を実行できます。KDE メニューの `コマンドの実行` オプションを使用すると、別のユーザーの認証情報を入力して、アプリケーションを別のユーザーとして起動することもできます。GNOME および GTK 環境では、 `gksu`と`gksudo`が広く使用されていました。これらは `sudo` または `su` のフロントエンドです。たとえば、`gksu synaptic` または `gksudo gparted` を実行すると、アプリケーションが起動し、パスワードの入力を求められます。
現代のシステムでは、gksu は推奨されないか、非推奨となっています。その一般的な代替手段は、PolicyKit をベースとしたpkexecです。pkexec は、定義されたポリシーに従ってプログラムを特権付きで実行できるようにします。多くの最新のランチャーは、管理タスクに pkexec を使用しています。基本的な考え方は同じで、ユーザーはターミナルを開く必要はなく、システムが制御された方法で認証を検証します。
ランチャーにショートカットを作成するには、.desktopファイルを編集します。重要なのは `Exec` 行です。root 権限で実行したい場合は、`Exec=gksu /path/to/program`、`Exec=kdesu /path/to/program`、または `Exec=pkexec /path/to/program` のように記述します。`sudo` を直接使用する場合は、ランチャーで `Terminal=true` を設定するか、グラフィカルな askpass を設定する必要があります。また、Alt+F2 を押してヘルパーとプログラム名を入力することもできます。たとえば、`gksu synaptic` と入力します。KDE では、`kdesu synaptic` または別のユーザーとして実行するオプションで同様の機能が得られます。
古典的な代替手段として、GUI アプリケーションのラッパーであるconsolehelperがあります。たとえば、/usr/bin/xterm-root というシンボリックリンクを作成し、/usr/sbin/consolehelper を指すようにします。次に、config-util から取得した認証、アカウント、セッションのインクルージョンを使用して /etc/pam.d/xterm-root を作成し、PAM を設定します。続いて、/etc/security/console.apps/xterm-root を USER=root および PROGRAM=/usr/bin/xterm で定義します。xterm-root を実行すると、consolehelper は PAM 認証を要求し、root 権限で xterm を起動します。「Xlib connection to :0.0 refused by server」エラーが発生した場合は、xhost local:root を実行すると解決する場合があります。
いずれにせよ、グラフィカルアプリケーションをroot権限で起動することには欠点があります。環境変数が混在したり、セッションバスが破損したり、WaylandやX11に影響を与えたり、ホームディレクトリにroot所有のファイルが作成されたりする可能性があります。root権限は特定の管理ツールにのみ使用し、使用後はすぐに閉じるのが最善です。インターネットを閲覧したり、疑わしいドキュメントをroot権限で開いたりしないでください。あらゆる攻撃によって完全な権限が継承されてしまうからです。
ルートアクセスを必要とするタスクの一般的な例
日常的な操作の多くは、管理者権限を必要とします。apt、zypper、dnf、yum などを使用してパッケージを管理する場合、多くの場合 sudo が必要です。例えば、`sudo apt update`、`sudo apt install firefox`、`sudo zypper install docker-ce` などです。システムサービスについても同様です。`sudo systemctl restart apache2`、`sudo systemctl restart ssh`、`sudo systemctl restart nginx` などです。ユーザーアカウントを変更するには `sudo usermod` を、ファイルの所有権を変更するには `sudo chown` を使用します。`/etc/ssh/sshd_config` などの重要な設定ファイルを nano、vim、gedit で編集する場合も、root 権限が必要です。
情報を読み取るだけのコマンドやシステムを変更しないコマンド(`zypper repos`や`systemctl status NetworkManager`など)には`sudo`は必要ありません。習慣的に何でもかんでも`sudo`を使うのは良くありません。賢明なのは、タスクに必要な場合にのみ権限を昇格させ、できるだけ早く通常のユーザーに戻すことです。
特権昇格を伴う作業におけるベストプラクティス

最小権限の原則は、あらゆる場面で指針となるべきです。可能な限り個々のコマンドには`sudo`を使用し、どうしても必要な場合を除き、root権限での永続的なシェル実行は避け、作業が完了したらすぐに終了してください。出所不明のスクリプトをroot権限で実行しないでください。事前にコードを確認し、公式リポジトリまたは信頼できるプロジェクトからダウンロードし、チェックサムを検証し、疑問点があれば隔離された環境でテストしてください。完全な権限を持つサードパーティ製コードを扱う際には、健全な懐疑心を持つことが美徳です。
sudoersの設定は、sudoグループだけに頼らず、きめ細かく設定することをお勧めします。また、ログの監査も重要です。サーバーを管理している場合は、不正使用を検出するために、`/var/log/auth.log`、`/var/log/secure`、または`journalctl -xe`を確認してください。マルチユーザー環境では、各コマンドを誰が実行したかを把握することが、説明責任とセキュリティ規制の遵守において重要です。
ヘッドを使用してルート権限を有効化および無効化します。
ルートアクセスを有効にする場合は、`sudo passwd root` でパスワードを設定し、必要最低限のタスクのみに使用してから、アカウントを再度ロックしてください。SSH への直接ログインを無効にするには、`sshd_config` を編集して `PermitRootLogin no` または `prohibit-password` を設定し、SSH を再起動してください。アカウントをローカルでロックするには、`sudo passwd -l root` を使用します。ロックを解除するには、`sudo passwd -u root` を使用します。これらの対策により、攻撃対象領域が縮小され、最も強力なアカウントに対するブルートフォース攻撃を防ぐことができます。
ほとんどの場合、最初の質問に対する実際的な答えは「はい」です。kdesu、gksu、gksudo、pkexecなどのグラフィカルヘルパーを使用するか、適切なコマンドを含む.desktopファイルを作成することで、root権限でランチャーからプログラムを起動できます。ただし、これはあらゆるアプリケーションに対して設定しておくべきものではありません。明確な名前の専用の管理者用ランチャーを用意し、必要な場合にのみ使用する方が賢明です。
重要なポイントは、root権限はおもちゃではなく、sudoはまさに、あらゆるクリックを恒久的なリスクにすることなく、ユーザーに権限を与えるために存在するということです。グラフィカルアプリケーションをスーパーユーザーとして起動する必要がある場合は、パスワードを要求するヘルパーを優先し、アプリケーションが本当にパスワードを必要とするかどうかを確認し、使用を管理者タスクに限定してください。こうすることで、Linuxの強力なセキュリティを損なうことなく、ランチャーの利便性を享受できます。