![見出し画像](https://assets.st-note.com/production/uploads/images/130568636/rectangle_large_type_2_cea1835a870fb2bb0bf19cd1e7a15c2d.png?width=1200)
332.3 リソース制御
課題 332: ホストセキュリティ
332.3 リソース制御
LPIC303の試験範囲である主題331~335まであるうちの「332: ホストセキュリティ」から「332.3 リソース制御」についてのまとめ
総重量:3
説明:
サービスとプログラムが利用可能なリソースを制限できる。主要な知識範囲:
ulimitsの理解と設定
クラス・リミット・アカウンティングを含むcgroupsの理解。
cgroupsの管理と、cgroup associationの加工。
スライスを含む、systemdリソース制御の理解
systemdユニットのリソース制限の設定。
cgmanagerとlibcgroupユーティリティーの知識。
重要なファイル、用語、ユーティリティ:
ulimit
/etc/security/limits.conf
pam_limits.so
/sys/fs/group/
/proc/cgroups
systemd-cgls
systemd-cgtop
ulimitsの理解と設定
ulimitの理解
「ulimit」はユーザーが使用できるリソースを制限するコマンドです。ファイルの最大サイズや、使用できるメモリ、同時に実行できるプロセス数などを制限できます。
なお、ulimitはbashの内部コマンド(ビルトインコマンド、シェルコマンド)であるため、「man」コマンドではなく、「help」コマンドで詳細を表示できます。
ulimitコマンド
-a
現在の設定-H
ハードリミット
変更できるのはrootユーザーのみ-S
ソフトリミット
ハードリミットの範囲内であれば一般ユーザーも変更可能
ulimitで設定できる項目
設定項目 (単位, コマンドオプション) 設定値
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 6897
max locked memory (kbytes, -l) 8192
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 6897
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@lpic303-rocky34 ~]#
設定ファイル
/etc/security/limits.conf
"/etc/security/limits.conf" で設定したリソース制限は "pam_limits.so" によって適用される
設定例)
<domain>:制限の対象(ユーザーやグループ)
<type>:hard(ハードリミット) or soft(ソフトリミット)
<item>:制限する項目
<value>:制限する値
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
pam_limits.so
RockyLinux9の場合
/usr/lib64/security/pam_limits.so
"/etc/pam.d/system-auth" で設定されている
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authselect is run.
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass nullok
auth required pam_deny.so
account required pam_unix.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so <---★これ
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
[root@lpic303-rocky34 ~]#
Ubuntu22.04の場合
/usr/lib/x86_64-linux-gnu/security/pam_limits.so
"/etc/pam.d/~" で設定されている
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# grep "pam_limits" /etc/pam.d/*
/etc/pam.d/cron:session required pam_limits.so
/etc/pam.d/login:session required pam_limits.so
/etc/pam.d/runuser:session required pam_limits.so
/etc/pam.d/sshd:session required pam_limits.so
/etc/pam.d/su:session required pam_limits.so
/etc/pam.d/sudo:session required pam_limits.so
/etc/pam.d/sudo-i:session required pam_limits.so
root@lpic303-ubuntu35:~#
cgroupsの理解
cgroupは"Control Group"の略です。プロセスをグループ化して、そのグループ内に存在するプロセスに対して共通の管理を行うために使います。たとえば、ホストOSが持つCPUやメモリなどのリソースに対して、グループごとに制限をかけることができます。
クラス
<・・・調査中・・・>
リミット
<・・・調査中・・・>
アカウンティング
<・・・調査中・・・>
コントローラー(cgroup-v1)
blkio:ブロックデバイスへの入出力アクセスを制限
cpu:Completely Fair Scheduler (CFS) パラメーターを調整
cpuacct:CPU リソースに関する自動レポートを作成
cpuset:指定された CPU のサブセットでのみ実行されるように制限
devices:デバイスへのアクセスを制御
freezer:一時停止または再開
hugetlb:容量の仮想メモリーページの使用を制限
memory:メモリー使用の制限
net_cls:ネットワークトラフィックの制限
net_prio:ネットワークトラフィックの優先度を設定
perf_event:perf ツールでモニタリングできるようにする
pids:多数のプロセスとその子プロセスに制限
rdma:Remote Direct Memory Access/InfiniB 固有リソースに制限
コントローラー(cgroup-v2)
cpu
cpuset
device
freezer
hugetlb
io:cgroup-v1の blkio に相当
memory
misc
perf_event
pids
rdma
★RockyLinux9★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
[root@lpic303-rocky34 ~]#
★Ubuntu22.04★
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
root@lpic303-ubuntu35:~#
参考
cgroupsの管理と、cgroup associationの加工
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 0 65 1
cpu 0 65 1
cpuacct 0 65 1
blkio 0 65 1
memory 0 65 1
devices 0 65 1
freezer 0 65 1
net_cls 0 65 1
perf_event 0 65 1
net_prio 0 65 1
hugetlb 0 65 1
pids 0 65 1
rdma 0 65 1
misc 0 65 1
[root@lpic303-rocky34 ~]#
スライスを含む、systemdリソース制御の理解
systemd は slice、scope、および service ユニットの階層を自動的に作成して、cgroup ツリーに統一された構造を提供します。systemctl コマンドを使用するとカスタムスライスを作成して、この構造をさらに変更できます。
systemdのユニットタイプ
サービス
name.service
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemctl -t service
UNIT LOAD ACTIVE SUB DESCRIPTION >
auditd.service loaded active running Security Auditing Service
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus-broker.service loaded active running D-Bus System Message Bus
dracut-shutdown.service loaded active exited Restore /run/initramfs on shutdown
getty@tty1.service loaded active running Getty on tty1
kdump.service loaded active exited Crash recovery kernel arming
kmod-static-nodes.service loaded active exited Create List of Static Device Nodes
lvm2-monitor.service loaded active exited Monitoring of LVM2 mirrors, snapshots etc. using dm>
NetworkManager-wait-online.service loaded active exited Network Manager Wait Online
NetworkManager.service loaded active running Network Manager
nis-domainname.service loaded active exited Read and set NIS domainname from /etc/sysconfig/net>
rsyslog.service loaded active running System Logging Service
sshd.service loaded active running OpenSSH server daemon
systemd-boot-update.service loaded active exited Automatic Boot Loader Update
systemd-journal-flush.service loaded active exited Flush Journal to Persistent Storage
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-modules-load.service loaded active exited Load Kernel Modules
systemd-network-generator.service loaded active exited Generate network units from Kernel command line
systemd-random-seed.service loaded active exited Load/Save Random Seed
systemd-remount-fs.service loaded active exited Remount Root and Kernel File Systems
systemd-sysctl.service loaded active exited Apply Kernel Variables
systemd-tmpfiles-setup-dev.service loaded active exited Create Static Device Nodes in /dev
systemd-tmpfiles-setup.service loaded active exited Create Volatile Files and Directories
systemd-udev-trigger.service loaded active exited Coldplug All udev Devices
systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files
systemd-update-utmp.service loaded active exited Record System Boot/Shutdown in UTMP
systemd-user-sessions.service loaded active exited Permit User Sessions
user-runtime-dir@1000.service loaded active exited User Runtime Directory /run/user/1000
user@1000.service loaded active running User Manager for UID 1000
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
32 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
[root@lpic303-rocky34 ~]#
スコープ
name.scope
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemctl -t scope
UNIT LOAD ACTIVE SUB DESCRIPTION
init.scope loaded active running System and Service Manager
session-1.scope loaded active running Session 1 of User rocky
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
2 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
[root@lpic303-rocky34 ~]#
スライス
parent-name.slice-.slice:ルートスライス
system.slice:システムサービス
user.slice:ユーザーセッション
machine.slice:仮想マシンとコンテナのスライス
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemctl -t slice
UNIT LOAD ACTIVE SUB DESCRIPTION
-.slice loaded active active Root Slice
system-getty.slice loaded active active Slice /system/getty
system-modprobe.slice loaded active active Slice /system/modprobe
system-sshd\x2dkeygen.slice loaded active active Slice /system/sshd-keygen
system-systemd\x2dhibernate\x2dresume.slice loaded active active Slice /system/systemd-hibernate-resume
system.slice loaded active active System Slice
user-1000.slice loaded active active User Slice of UID 1000
user.slice loaded active active User and Session Slice
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
8 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
[root@lpic303-rocky34 ~]#
systemdユニットのリソース制限の設定
systemctlコマンド
systemctl set-property <UNIT名> <設定項目=設定値>
"/etc/systemd/system/<UNIT名>/override.conf" が生成される。systemctl revert <UNIT名>
"override.conf" が削除される=ユニットの初期状態に戻る
systemd-cglsコマンド
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemd-cgls
Control group /:
-.slice
├─user.slice (#975)
│ → user.invocation_id: 16de66fd14424a43b97454ad731dfba6
│ → trusted.invocation_id: 16de66fd14424a43b97454ad731dfba6
│ └─user-1000.slice (#2598)
│ → user.invocation_id: f606f6290f8f4b82b448d8bdb5337711
│ → trusted.invocation_id: f606f6290f8f4b82b448d8bdb5337711
│ ├─user@1000.service … (#2668)
│ │ → user.delegate: 1
│ │ → trusted.delegate: 1
│ │ → user.invocation_id: 0d86fbae97854b06b8fbdbbf188f98cb
│ │ → trusted.invocation_id: 0d86fbae97854b06b8fbdbbf188f98cb
│ │ └─init.scope (#2703)
│ │ ├─1194 /usr/lib/systemd/systemd --user
│ │ └─1196 (sd-pam)
│ └─session-1.scope (#2843)
│ ├─1189 sshd: rocky [priv]
│ ├─1203 sshd: rocky@pts/0
│ ├─1204 -bash
│ ├─1225 sudo su
: :
systemd-cgtop コマンド
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemd-cgtop
Control Group Tasks %CPU Memory Input/s Output/s
/ 114 5.9 258.4M - -
user.slice 9 1.4 17.1M - -
user.slice/user-1000.slice 9 1.4 17.1M - -
user.slice/user-1000.slice/session-1.scope 7 1.4 12.7M - -
system.slice 20 0.0 129.6M - -
system.slice/rsyslog.service 3 0.0 2.2M - -
dev-hugepages.mount - - 52.0K - -
dev-mqueue.mount - - 4.0K - -
init.scope 1 - 33.5M - -
sys-fs-fuse-connections.mo
:
cgmanagerとlibcgroupユーティリティーの知識
cgmanager
<・・・調査中・・・>
libcgroup
<・・・調査中・・・>
参考文献
How to understand the linux control groups cgroups - YouTube
Using Linux cgroups to control how processes share server resources - YouTube
この記事が気に入ったらサポートをしてみませんか?