見出し画像

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 】コマンド――ユーザーが使用できるリソースを制限する:Linux基本コマンドTips(326) - @IT

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やメモリなどのリソースに対して、グループごとに制限をかけることができます。

第3回 Linuxカーネルのコンテナ機能[2] ─cgroupとは?(その1) | gihyo.jp

クラス

<・・・調査中・・・>

リミット

<・・・調査中・・・>

アカウンティング

<・・・調査中・・・>

コントローラー(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 コマンドを使用するとカスタムスライスを作成して、この構造をさらに変更できます。

1.2. デフォルトの cgroup 階層 Red Hat Enterprise Linux 7 | Red Hat Customer Portal

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

<・・・調査中・・・>


参考文献


この記事が気に入ったらサポートをしてみませんか?