Linux系统安全

系统安全

系统权限

安装系统

  • 选择稳定版操作系统:CentOS6.9,CentOS7.6

  • 最小化安装:方便后期部署与升级应用

  • 不要安装gcc,make,防止黑客入侵,直接编译

  • 安装完系统后更新系统,使系统处于稳定状态

    [root@server1 ~]# yum -y update
    

文件权限

  • 基本权限

    • 目录:默认权限=777-umask
    • 文件:默认权限=666-umask
    root的umask值
    [root@server1 ~]# umask
    0022
    
    普通用户的umask值
    [zhangsan@server1 ~]$ umask
    0002
    
    root家目录权限(550)
    [root@server1 ~]# ll -d
    dr-xr-x---. 4 root root 175 8月  21 12:06 .
    
    tmp目录权限(1777)
    [root@server1 ~]# ll -d /tmp
    drwxrwxrwt. 7 root root 93 8月  21 12:15 /tmp
    
  • 特殊权限

    • suid 冒险位,执行二进制文件与文件所有人有关,与谁来执行无关,
    [root@server1 ~]# chmod 4755 filename 
    [root@server1 ~]# chmod u-s filename
    
    • sgid 强制位,对目录生效,在此目录中创建文件自动归入目录所在组
    [root@server1 ~]# chmod 2755 dirname/
    [root@server1 ~]# chmod g-s dirname/
    
    • sticky 粘制位,目录中的文件只能被文件拥有者删除
    [root@server1 ~]# chmod 1755 dirname/
    [root@server1 ~]# chmod o-t dirname/
    
  • 文件ACL:访问控制列表

    • 独立于基础权限与特殊权限之外
    • 对文件的权限进行附加说明的权限设定方式
    • ACL提供传统的owner/group/other的read/write/execute之外的细部权限设定,可以针对单一的使用者,目录等等
    • 查看
    [root@server1 ~]# ll
    总用量 4
    -rw-------. 1 root root 1243 7月  24 17:35 anaconda-ks.cfg
    -rw-r--r--  1 root root    0 8月  21 12:45 file1
    -rw-rw-r--+ 1 root root    0 8月  21 12:45 file2
    
    说明:
    -rw-r--r--.如果权限后面带有‘.’号表示默认创建
    -rw-r--r-- 如果权限后面说明都没有表示在关闭selinux的情况下创建
    -rw-r--r--+ 如果权限后面带有‘+’号表示有ACL权限
    
    [root@server1 ~]# getfacl file2
    # file: file2
    # owner: root
    # group: root
    user::rw-
    user:zhangsan:rw-
    group::r--
    mask::rw-
    other::r--
    
    • 设定ACL权限
    [root@server1 ~]# setfacl -m u:zhangsan:rw file2
    
    #setfacl -m <u|g>:<username|groupname>:权限 filename	##设置权限
    #setfacl -x <u|g>:<username|groupname> filename	##去除某个用户或者组的acl 
    #setfacl -b filename	##删除文件上的权限列表
    
  • 文件属性

    • chaatr +a 文件名 只允许对文件进行追加操作,不能修改,不能删除
    [root@server1 ~]# chattr +a file1
    [root@server1 ~]# echo "hello" > file1
    -bash: file1: 不允许的操作
    [root@server1 ~]# echo "hello" >> file1
    [root@server1 ~]# rm -rf file1
    rm: 无法删除"file1": 不允许的操作
    
    去除该属性
    [root@server1 ~]# chattr -a file1
    
    • chaatr +i 文件名 文件被锁定,只读
    [root@server1 ~]# chattr +i file1
    [root@server1 ~]# cat file1
    hello
    [root@server1 ~]# echo "world" >> file1
    -bash: file1: 权限不够
    [root@server1 ~]# rm -rf file1
    rm: 无法删除"file1": 不允许的操作
    
    • 查看文件属性
    [root@server1 ~]# lsattr file1
    -----a---------- file1
    [root@server1 ~]# lsattr file1
    ----i----------- file1
    
    • 常用案例
    锁定重要文件
    [root@server1 ~]# find /bin /sbin /usr/sbin /usr/bin /etc/shadow /etc/passwd /etc/pam.d -type f -exec chattr +i {} \;
    [root@server1 ~]# useradd lisi
    useradd:无法打开 /etc/passwd
    
    日志文件防删除
    [root@server1 ~]# chattr +a /var/log/messages /var/log/secure
    #日志切割要先去掉a属性,之后增加a属性
    [root@server1 ~]# vim /etc/logrotate.d/syslog
    prerotate
    	chattr -a /var/log/messages
    endscript
    
    ...
    
    postrotate
    	chattr +a /var/log/messages
    endscript
    }
    
  • mount命令的权限

    • rw可读可写&ro只读
    • sync同步&async异步
    • auto自动挂载&noauto非自动挂载

用户授权

给普通用户提升(赋予)权限的方法

  • 设置特殊权限:suid,sgid

  • 修改文件权限:usermod

  • 切换用户:switching users with su

  • sudo提权:running commands as root with sudo

su切换用户

  • su username 仅切换用户,环境变量不切换,导致很多命令不可用
  • su - username= 切换用户至用户家目录,环境变量会发生改变
  • 超管–>普通用户,不需要密码
  • 普通用户–>超管|普通用户,需要密码

sudo

  • 可根据/etc/sudoers文件设置普通用户使用sudo命令时可以以root身份或其他用户身份运行命令,从而提升权限
  • sudo语法
#user	MACHINE=(RUN_AS_USER)	COMMANDS
用户名	运行的主机=(以什么身份)	允许执行的命令
root	ALL=(ALL)	ALL 
cephu	ALL=(root)	NOPASSWD:ALL
  • 案例:对用户授权
[root@server1 ~]# ll /etc/sudoers
-r--r-----. 1 root root 4365 8月  16 13:00 /etc/sudoers
[root@server1 ~]# chmod 640 /etc/sudoers
[root@server1 ~]# ll /etc/sudoers
-rw-r-----. 1 root root 4365 8月  16 13:00 /etc/sudoers

赋予zhangsan用户使用ip,fdisk,less命令的权限
[root@server1 ~]# cat /etc/sudoers|grep -Ev '^$|^#' |grep zhangsan
zhangsan	ALL=/sbin/ip,/sbin/fdisk,/bin/less

赋予lisi用户使用less命令的权限且切换时不需要输入密码
[root@server1 ~]# cat /etc/sudoers|grep -Ev '^$|^#' |grep lisi
lisi	ALL=NOPASSWD:/bin/less
  • 案例:对组授权
[root@server1 ~]# groupadd students
[root@server1 ~]# useradd it01 -G students 
[root@server1 ~]# useradd it02 -G students 

[root@server1 ~]# cat /etc/sudoers|grep -Ev '^$|^#' |grep students
%students	ALL=NOPASSWD:/sbin/ip
%students	ALL=NOPASSWD:/sbin/useradd, /sbin/userdel, /bin/passwd
%students	ALL=NOPASSWD:!/bin/passwd root, !/bin/passwd root --stdin, !/bin/passwd --stdin root
  • 别名使用
## Host Aliases
# Host_Alias FILESERVERS = fs1, fs2
Host_Alias MAILSERVERS = smtp, smtp2

## User Aliases
User_Alias ADMINS = jsmith, mikem

## Command Aliases
## These are groups of related commands...
## Networking
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum 

## Services
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

## Updating the locate database
Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

zhangsan	ALL=NOPASSWD: NETWORKING
lisi	ALL=NOPASSWD: STORAGE
%students	ALL=NOPASSWD: NETWORKING, STORAGE
  • sudo日志
[root@server1 ~]# grep '^authpriv' /etc/rsyslog.conf
authpriv.*                                              /var/log/secure
[root@server1 ~]# tail -f /var/log/secure
Aug 21 15:20:41 admin su: pam_unix(su-l:auth): authentication failure; logname=zhangsan uid=1001 euid=0 tty=pts/1 ruser=zhangsan rhost=  user=it01
Aug 21 15:20:56 admin passwd: pam_unix(passwd:chauthtok): password changed for it01
Aug 21 15:21:02 admin passwd: pam_unix(passwd:chauthtok): password changed for it02
Aug 21 15:21:09 admin su: pam_unix(su-l:session): session opened for user it01 by zhangsan(uid=1001)
Aug 21 15:21:27 admin sudo:    it01 : TTY=pts/1 ; PWD=/home/it01 ; USER=root ; COMMAND=/sbin/useradd it03
Aug 21 15:21:27 admin sudo: pam_unix(sudo:session): session opened for user root by zhangsan(uid=0)
Aug 21 15:21:27 admin useradd[29302]: new group: name=it03, GID=1006
Aug 21 15:21:27 admin useradd[29302]: new user: name=it03, UID=1005, GID=1006, home=/home/it03, shell=/bin/bash
Aug 21 15:21:27 admin sudo: pam_unix(sudo:session): session closed for user root
Aug 21 15:36:42 admin su: pam_unix(su-l:session): session closed for user it01

用户认证

用户认证方式

  • PAM

    • gdm:GNOME桌面(状态栏在上方)用户登录认证
    • kdm:KDE桌面(类似于Windows桌面)用户登录认证
    • su:切换用户需要认证
    • ssh:远程连接认证
    • samab:使用系统用户samba,和另创建的samba服务密码登录,只能访问samba目录
    • ftp:使用ftp系统用户及其密码
  • 自带数据库验证方式:建议使用

    • MySQL
    • Zabbix
  • web验证方式:htpasswd生成用户名和密码

PAM介绍

  • PAM(Pluggable Authentication Modules) 即可插拔式认证模块,它是一种高效而且灵活的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。

  • PAM可以根据用户的网段、时间、用户名、密码等实现认证

  • 使用帮助

查看man手册
[root@server1 ~]# man pam

借用浏览器查看文档
[root@server1 ~]# firefox /usr/share/doc/pam-1.1.8/html/Linux-PAM_SAG.html 
  • pam认证原理

Service(进程文件) → PAM配置文件 → 相关模块文件 → 模块的配置文件

举例说明

  • 进程文件/usr/sbin/sshd
  • 配置文件/etc/pam.d/sshd
  • 相关模块及其对应配置文件
    • /lib64/security/pam_access.so → /etc/security/access.conf
    • /lib64/security/pam_limits.so → /etc/security/limits.conf
    • /lib64/security/pam_time.so → /etc/security/time.conf
[root@server1 ~]# vim /etc/pam.d/sshd 
  1 #%PAM-1.0
  2 auth       required pam_sepermit.so
  3 auth       substack     password-auth
  4 auth       include      postlogin
  5 # Used with polkit to reauthorize users in remote sessions
  6 -auth      optional     pam_reauthorize.so prepare
  7 account    required     pam_nologin.so
  8 account    include      password-auth
  9 password   include      password-auth
 10 # pam_selinux.so close should be the first session rule
 11 session    required     pam_selinux.so close
 12 session    required     pam_loginuid.so
 13 # pam_selinux.so open should only be followed by sessions to be executed in the user context
 14 session    required     pam_selinux.so open env_params
 15 session    required     pam_namespace.so
 16 session    optional     pam_keyinit.so force revoke
 17 session    include      password-auth
 18 session    include      postlogin
 19 # Used with polkit to reauthorize users in remote sessions
 20 -session   optional     pam_reauthorize.so prepare

[root@server1 ~]# ls /lib64/security/
pam_access.so     pam_filter        pam_mkhomedir.so       pam_selinux.so     pam_unix_auth.so
pam_cap.so        pam_filter.so     pam_motd.so            pam_sepermit.so    pam_unix_passwd.so
pam_chroot.so     pam_ftp.so        pam_namespace.so       pam_shells.so      pam_unix_session.so
pam_console.so    pam_group.so      pam_nologin.so         pam_stress.so      pam_unix.so
pam_cracklib.so   pam_issue.so      pam_permit.so          pam_succeed_if.so  pam_userdb.so
pam_debug.so      pam_keyinit.so    pam_postgresok.so      pam_systemd.so     pam_warn.so
pam_deny.so       pam_lastlog.so    pam_pwhistory.so       pam_tally2.so      pam_wheel.so
pam_echo.so       pam_limits.so     pam_pwquality.so       pam_time.so        pam_xauth.so
pam_env.so        pam_listfile.so   pam_rhosts.so          pam_timestamp.so
pam_exec.so       pam_localuser.so  pam_rootok.so          pam_tty_audit.so
pam_faildelay.so  pam_loginuid.so   pam_securetty.so       pam_umask.so
pam_faillock.so   pam_mail.so       pam_selinux_permit.so  pam_unix_acct.so

pam认证流程

[root@server1 ~]# vim /etc/pam.d/sshd 
  1 #%PAM-1.0
  2 auth       required pam_sepermit.so
  3 auth       substack     password-auth
  4 auth       include      postlogin
  5 # Used with polkit to reauthorize users in remote sessions
  6 -auth      optional     pam_reauthorize.so prepare
  7 account    required     pam_nologin.so
  8 account    include      password-auth
  9 password   include      password-auth
 10 # pam_selinux.so close should be the first session rule
 11 session    required     pam_selinux.so close
 12 session    required     pam_loginuid.so
 13 # pam_selinux.so open should only be followed by sessions to be executed in the user context
 14 session    required     pam_selinux.so open env_params
 15 session    required     pam_namespace.so
 16 session    optional     pam_keyinit.so force revoke
 17 session    include      password-auth
 18 session    include      postlogin
 19 # Used with polkit to reauthorize users in remote sessions
 20 -session   optional     pam_reauthorize.so prepare
 说明
 	认证类型	认证条件	认证需要的模块
  • PAM常见认证类型

    • auth:认证管理。验证使用者身份,账号和密码
    • account:用户管理。基于用户时间或密码有效期来决定是否允许访问
    • password:密码(口令)认证管理。禁止用户反复尝试登录,变更密码时进行密码复杂性控制
    • session:会话管理。进行日志记录,或者限制用户登录的次数,资源限制
  • 认证条件

    • Required (必要条件) :验证失败时仍然继续,但返回fail,用户不会知道哪里失败
    • Requisite (必要条件) :验证失败时则立即结束整个验证过程,返回fail
    • Sufficient (充分条件) :验证成功则立即返回,不再继续,否则忽略结果并继续
    • Optional (可选条件) :无论验证结果如何,均不会影响,常用于session类型
    • Include :包含另外一个配置文件中类型相同的行
    • substack :垂直叠加

PAM常用模块

  • pam_rootok.so

    • 功能:用户UID是0,返回成功
    • 案例:限制root切换用户需要密码
    [root@server1 ~]# vim /etc/pam.d/su
    [root@server1 ~]# cat /etc/pam.d/su |grep pam_rootok.so
    #auth		sufficient	pam_rootok.so
    
    [root@server1 ~]# su - zhangsan
    密码:
    上一次登录:六 8月 21 12:18:35 CST 2021从 192.168.139.1pts/1 上
    
  • pam_access.so

    • 功能:访问控制,默认配置文件/etc/security/access.conf ,通常作用于登录程序,如su,login,gdm,sshd,
    • 案例:不允许root在192.168.139.20使用ssh远程登录
    添加pam_access.so模块
    [root@server1 ~]# vim /etc/pam.d/sshd 
    [root@server1 ~]# cat /etc/pam.d/sshd |grep auth
    auth	   required	pam_access.so			添加该行
    auth	   required	pam_sepermit.so
    auth       substack     password-auth
    auth       include      postlogin
    
    修改配置文件
    [root@server1 ~]# vim /etc/security/access.conf 
    [root@server1 ~]# cat /etc/security/access.conf |grep -Ev "^#|^$"
    -:root:192.168.139.20
    
    验证
    [root@server2 ~]# ip a
        inet 192.168.139.20/24 brd 192.168.139.255 scope global noprefixroute
    [root@server2 ~]# ssh root@192.168.139.10
    The authenticity of host '192.168.139.10 (192.168.139.10)' can't be established.
    ECDSA key fingerprint is SHA256:+RvxL8ZDWnyO030Z5rOfjBuJaOG1yFvD9ieOY9uzWBA.
    ECDSA key fingerprint is MD5:d2:a2:8c:c6:60:15:46:9b:09:75:ce:3f:e1:ea:6e:aa.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.139.10' (ECDSA) to the list of known hosts.
    root@192.168.139.10's password: 
    Permission denied, please try again.
    root@192.168.139.10's password: 
    Permission denied, please try again.
    root@192.168.139.10's password: 
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
    
  • pam_listfile.so

    • 功能:自定义黑名单或白名单
    • 案例
    vsftpd黑名单或白名单
    [root@server1 ~]# yum install -y vsftpd
    [root@server1 ~]# vim /etc/pam.d/vsftpd 
      1 #%PAM-1.0
      2 session    optional     pam_keyinit.so    force revoke
      3 auth       required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers     onerr=succeed	这里定义了vsftpd的黑名单
      4 auth       required pam_shells.so
      5 auth       include  password-auth
      6 account    include  password-auth
      7 session    required     pam_loginuid.so
      8 session    include  password-auth
    
    sshd黑名单或白名单
    [root@server1 ~]# vim /etc/pam.d/sshd 
    [root@server1 ~]# cat /etc/pam.d/sshd |grep auth
    auth       required pam_listfile.so	item=user	sense=allow	file=/etc/ssh_users	onerr=fail	仿照vsftpd黑名单,编写sshd的白名单
    auth	   required	pam_access.so
    auth	   required	pam_sepermit.so
    auth       substack     password-auth
    auth       include      postlogin
    [root@server1 ~]# echo root >> /etc/ssh_users
    
  • pam_time.so

    • 功能:基于时间的访问控制,默认文件/etc/security/time.conf
    • 案例:基于时间限制sshd的访问
    添加模块
    [root@server1 ~]# vim /etc/pam.d/sshd 
      1 #%PAM-1.0
      2 auth       required pam_listfile.so item=user   sense=allow file=/etc/ssh_users onerr=fail
      3 auth       required pam_access.so
      4 auth       required pam_sepermit.so
      5 auth       substack     password-auth
      6 auth       include      postlogin
      7 # Used with polkit to reauthorize users in remote sessions
      8 -auth      optional     pam_reauthorize.so prepare
      9 account    required     pam_time.so		添加该模块
     10 account    required     pam_nologin.so
     11 account    include      password-auth
     12 password   include      password-auth
     13 # pam_selinux.so close should be the first session rule
     14 session    required     pam_selinux.so close
     15 session    required     pam_loginuid.so
     16 # pam_selinux.so open should only be followed by sessions to be executed in the user context
     17 session    required     pam_selinux.so open env_params
     18 session    required     pam_namespace.so
     19 session    optional     pam_keyinit.so force revoke
     20 session    include      password-auth
     21 session    include      postlogin
     22 # Used with polkit to reauthorize users in remote sessions
     23 -session   optional     pam_reauthorize.so prepare
     
    修改配置文件
    [root@server1 ~]# vim /etc/security/time.conf 
    [root@server1 ~]# cat /etc/security/time.conf |grep -Ev "^#|^$"
    sshd;*;*;MoTuWeThFr0800-1700
    说明
    服务名;终端;用户;时间段
    #该例:在周一到周五的8点到17点,所有终端的所有用户都能使用ssh连本机
    
    验证
    [root@server2 ~]# date
    2021年 11月 17日 星期三 23:01:50 CST
    [root@server2 ~]# ssh root@192.168.139.10
    root@192.168.139.10's password: 
    Authentication failed.
    
  • pam_tally2.so

    • 功能:登录统计
    • 案例:实现防止对sshd暴力破解
    [root@server1 ~]# vim /etc/pam.d/sshd 
    [root@server1 ~]# cat /etc/pam.d/sshd |grep pam_tally2.so
    auth	   required		pam_tally2.so	deny=3	even_deny_root	root_unlock_time=60	unlock_time=60
    说明:
    #deny=3 连续错误登录最大次数,超过最大次数,将被锁定
    #even_deny_root root用户也被要求锁定
    #root_unlock_time root用户被锁定后等待的时间,单位为秒
    #unlock_time 普通用户被锁定后等待的时间,单位为秒
    
    查看用户错误登录次数
    [root@server1 ~]# pam_tally2 -u root
    Login           Failures Latest failure     From
    root                8    11/18/21 14:13:30  192.168.139.20
    
    清空用户错误登录次数(解除锁定)
    [root@server1 ~]# pam_tally2 --reset -u root
    Login           Failures Latest failure     From
    root                8    11/18/21 14:13:30  192.168.139.20
    

PAM资源限制

  • PAM资源限制主要是对用户进行系统资源使用的限制

  • PAM资源限制默认已使用,我们只需要调整相应限制值即可

  • 相关模块:pam_limits.so

    • 功能:限制用户会话过程中对各种资源的使用情况。
    • 配置文件(缺省):/etc/security/limits.conf和/etc/security/limits.d/*.conf
    • 语法
    <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
    
  • 限制项

[root@server1 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7184
max locked memory       (kbytes, -l) 64
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) 7184
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  • 案例
设置用户最大打开文件数
#查看
[root@server1 ~]# ulimit -n
1024
#临时设置
[root@server1 ~]# ulimit -n 2048
[root@server1 ~]# ulimit -n
2048
#永久设置
[root@server1 ~]# vim /etc/security/limits.conf 
[root@server1 ~]# cat /etc/security/limits.conf |grep zhangsan
zhangsan	soft	nofile	10240
zhangsan	hard	nofile	20480
#验证
[root@server1 ~]# su - zhangsan
[zhangsan@server1 ~]$ ulimit -n -S
10240
[zhangsan@server1 ~]$ ulimit -n -H
20480

设置用户创建的最大进程数
[root@server1 ~]# ulimit -u
7184
[root@server1 ~]# vim /etc/security/limits.d/20-nproc.conf 
[root@server1 ~]# cat /etc/security/limits.d/20-nproc.conf 
*          soft    nproc     4096
#root       soft    nproc     unlimited
*			hard	nproc	8192		

[root@server1 ~]# su - zhangsan
[zhangsan@server1 ~]$ ulimit -u
4096
[zhangsan@server1 ~]$ ulimit -u -H
8192

Control Group(CGroup)资源限制组

  • 控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免多个容器同时运行时对宿主机系统的资源竞争。控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制和计费管理。控制组的设计目标是为不同的应用情况提供统一的接口,从控制单一进程(比如nice工具)到系统级虚拟化(包括OpenVZ、Linux-VServer、LXC等)。

  • 具体来看,控制组提供:

    • 资源限制(Resource limiting):可以将组设置为不超过设定的内存限制。比如:内存子系统可以为进程组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发Out of Memory警告。
    • 优先级(Prioritization):通过优先级让一些组优先得到更多的CPU等资源。
    • 资源审计(Accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。
    • 隔离(isolation):为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统。
    • 控制(Control):挂起、恢复和重启等操作。
  • cgroups: Control Groups 基于进程的限制,而非用户,因此对于root运行的进程也是一

  • cgroup将各种子系统定义为资源,命名为controller: 可配额/可度量 - Control Groups (cgroups)

  • cgroups实现了对资源的配额和度量九大子系统的资源

    • blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb
    • cpu 限制使用cpu比例
    • cpuacct 产生cgroup任务的cpu资源报告。
    • cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存
    • devices 允许或拒绝对设备的访问。
    • freezer 暂停和恢复cgroup任务。
    • memory 设置内存限制以及产生内存资源报告。
    • net_cls 标记每个网络包。
    • ns 名称空间子系统
  • 例如:对某个进程使用内存进行限制步骤

    • 需要在controller memory下建立cgroup,如nginx_mem控制组,并针对该控制组nginx_mem设置相应的内存限制参数
    • 将进程Nginx分配到 memory controller的控制组(nginx_mem),没有使用controller则不会限制
  • Cgroup实现资源限制的方法:

    • cgexec 手动分配
    • cgred 自动分配

cgroup安装

[root@server1 ~]# yum install -y libcgroup*
[root@server1 ~]# systemctl start cgconfig.service 
[root@server1 ~]# systemctl enable cgconfig.service 

案例1:使用CPU子系统创建两个cgroup

创建组
[root@server1 ~]# vim /etc/cgconfig.conf 
[root@server1 ~]# tail /etc/cgconfig.conf 
group lesscpu {
	cpu {
		cpu.shares=200;
	}
}
group morecpu {
	cpu {
		cpu.shares=800;
	}
}

重启服务
[root@server1 ~]# systemctl restart cgconfig.service 

将程序分配到相应的group实验中,为了让两个进程抢CPU时间片,故意只留一个CPU在线
[root@server1 ~]# lscpu
#查到有两个CPU
[root@server1 ~]# echo 0 > /sys/devices/system/cpu/cpu0/online
[root@server1 ~]# echo 1 > /sys/devices/system/cpu/cpu1/online

手动分配
[root@server1 ~]# cgexec -g cpu:lesscpu sha1sum /dev/zero
[root@server1 ~]# cgexec -g cpu:morecpu md5sum /dev/zero
[root@server1 ~]# top
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                          
 32233 root      20   0  108068    620    524 R 79.1  0.0   0:05.84 md5sum                                           
 32232 root      20   0  116760   1088    808 R 20.2  0.1   0:02.76 sha1sum 

在这里插入图片描述

案例2:限制进程使用Memory

创建组
[root@server1 ~]# vim /etc/cgconfig.conf 
[root@server1 ~]# tail -6 /etc/cgconfig.conf 
group lessmem {
	memory {
		memory.limit_in_bytes=268435465;	物理内存限制256M
		memory.memsw.limit_in_bytes=268435465;	总内存限制,物理+SWAP
	}
}

重启
[root@server1 ~]# systemctl restart cgconfig.service 

创建内存盘并测试
[root@server1 ~]# mkdir /mnt/mem_test
[root@server1 ~]# mount -t tmpfs /dev/shm /mnt/mem_test
[root@server1 ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200
记录了200+0 的读入
记录了200+0 的写出
209715200字节(210 MB)已复制,1.01048 秒,208 MB/[root@server1 ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file1 bs=1M count=500
已杀死

转存中…(img-OLHuLFFn-1637225149785)]

案例2:限制进程使用Memory

创建组
[root@server1 ~]# vim /etc/cgconfig.conf 
[root@server1 ~]# tail -6 /etc/cgconfig.conf 
group lessmem {
	memory {
		memory.limit_in_bytes=268435465;	物理内存限制256M
		memory.memsw.limit_in_bytes=268435465;	总内存限制,物理+SWAP
	}
}

重启
[root@server1 ~]# systemctl restart cgconfig.service 

创建内存盘并测试
[root@server1 ~]# mkdir /mnt/mem_test
[root@server1 ~]# mount -t tmpfs /dev/shm /mnt/mem_test
[root@server1 ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200
记录了200+0 的读入
记录了200+0 的写出
209715200字节(210 MB)已复制,1.01048 秒,208 MB/[root@server1 ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file1 bs=1M count=500
已杀死
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值