Linuxにおけるsudo権限昇格の設定と管理
sudo権限昇格とは
sudo(superuser do)は、システム管理者が一般ユーザーに特定のコマンドをroot権限で実行する権限を付与するためのメカニズムです。これにより、rootユーザーとして直接ログインすることなく、必要な管理タスクを実行できます。
なぜ権限昇格が必要か
Linuxシステムの運用において、rootユーザーとして常時作業することはセキュリティリスクが伴います。root権限はシステム全体を変更できるため、誤操作による深刻な問題を引き起こす可能性があります。また、rootユーザーでのリモートログインはセキュリティ上の脅威となります。sudoを使用すること、これらのリスクを低減しつつ必要な管理タスクを実行できます。
権限昇格のプロセス
- 管理者による権限付与(/etc/sudoersファイルの修正)
- 一般ユーザーによるsudo形式でのコマンド実行
- sudo -lコマンドで権限状況の確認
sudo権限昇格の設定方法
/etc/sudoersファイルを修正する方法には、主に2つのアプローチがあります。
権限付与方法
- visudo: 構文チェック機能付き(デフォルトで色分け表示なし)
- vim /etc/sudoers: 構文チェックなし(デフォルトで色分け表示あり)
権限付与の形式
基本的な権限付与形式は以下の通りです:
ユーザー名またはグループ名(%グループ名) 認証ドメインでの有効範囲 実行可能なコマンドリスト
具体的な例:
ユーザー/グループ ALL=(ALL) NOPASSWD: ALL
sudo権限昇格のテスト
権限昇格未設定時のテスト
# 権限昇格未設定のテスト [root@web1 ~]# useradd testuser [root@web1 ~]# echo password | passwd --stdin testuser [root@web1 ~]# su - testuser [testuser@web1 ~]$ useradd newuser useradd: Permission denied. useradd: cannot lock /etc/passwd; try again later. [testuser@web1 ~]$ exit logout
権限昇格設定後のテスト
# 権限昇格のテスト
[root@web1 ~]# visudo
100 root ALL=(ALL) ALL
101 testuser ALL=(ALL) NOPASSWD: ALL # 追加
[root@web1 ~]# su - testuser
[testuser@web1 ~]$ sudo -l
...
User testuser may run the following commands on web1:
(ALL) ALL
[testuser@web1 ~]$ sudo useradd newuser
[testuser@web1 ~]$ sudo id newuser
uid=1048(newuser) gid=1048(newuser) groups=1048(newuser)
[testuser@web1 ~]$ exit
Ansibleを使用したsudo権限昇格の設定
対象ノードでのユーザー作成とsudo権限付与
[root@ansible-controller ~]# vim sudo_user.yml
---
- name: sudoユーザーの設定
hosts: all
tasks:
- name: sudoユーザーの作成
user:
name: ansible_user
password: "{{ 'securepassword' | password_hash('sha512') }}"
state: present
- name: sudo権限の設定
lineinfile:
path: /etc/sudoers
line: "ansible_user ALL=(ALL) NOPASSWD: ALL"
state: present
validate: /usr/sbin/visudo -cf %s
[root@ansible-controller ~]# ansible-playbook sudo_user.yml
Ansible設定ファイルの修正
[root@ansible-controller ~]# vim ansible.cfg [defaults] inventory = inventory host_key_checking = false remote_user = ansible_user roles_path = ./roles [privilege_escalation] become = true become_method = sudo become_user = root become_ask_pass = false
SSH接続の設定
ansible_userユーザーでパスワードなしでSSH接続できるように設定します:
[root@ansible-controller ~]# for host in web1 web2 db1; do
ssh-copy-id ansible_user@$host
done
動作確認
[root@ansible-controller ~]# ansible all -m ping