首页 > 其他分享 >SUDO,PAM配置规范说明

SUDO,PAM配置规范说明

时间:2022-10-28 08:58:59浏览次数:67  
标签:SUDO 规范 PAM etc so 模块 root pam

sudo

sudo简介

  1. 说明

    sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如mount、reboot、shutdown、init、halt、user等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。
    备注:Ubuntu安装系统,默认禁用root账号而第一个普通用户就配置好sudo权限,centos默认启用root账号,因此普通用户需自行配置sudo权限
    

文件相关配置

  1. sudo配置文件

    /etc/sudoers
    
  2. 通配符

    ? 任意单一字符
    * 匹配任意长度字符
    [wxc] 匹配其中一个字符
    [!wxc] 除了这三个字符的其它字符
    \x 转义
    [[alpha]] 字母
    
  3. 格式

    • 格式定义

      root ALL=(ALL) ALL
      
    • 格式说明

      user: 运行命令者的身份
      host: 通过哪些主机
      (runas):以哪个用户的身份
      command: 运行哪些命令
      
    • 格式别名

      User和runas:
          username
          #uid
          %group_name
          %#gid
          user_alias|runas_alias
      host:
          ip或hostname
          network(/netmask)
          host_alias
      command:
          command name
          directory
          sudoedit
          Cmnd_Alias
      
    • sudo别名类型

      User_Alias
      Runas_Alias
      Host_Alias
      Cmnd_Alias
      
    • 别名格式

      [A-Z]([A-Z][0-9]_)*
      

案例

  1. 案例1:用户命令授权,配置visudo /etc/sudoers

    授权mount命令挂载:
    zxl  ALL=(root)  /usr/bin/mount /dev/cdrom /mnt/,/usr/bin/umount /mnt
    
    获取root所有权限
    zxl  ALL=(root)       ALL
    
    对授权的命令进行取反
    zxl  ALL=(ALL)       ALL,!/usr/bin/vim,!/usr/bin/su
    
  2. 案例2:别名授权,配置visudo /etc/sudoers

    #用户别名定义
    User_Alias SYSADER=wang,mage,%admins
    User_Alias DISKADER=tom
    
    #主机别名定义
    Host_Alias SERS=www.magedu.com,172.16.0.0/24
    
    #用户身份别名定义
    Runas_Alias OP=root
    
    #命令别名定义
    Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod
    Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk
    Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd [azA-Z]*, !/usr/bin/passwd root
    
    #别名运用方法root ALL=(ALL) ALL
    SYSADER SERS= SYDCMD,DSKCMD
    DISKADER ALL=(OP) DSKCMD
    #ADMINCMD命令访问无需密码验证,/usr/sbin/userdel命令需要密码验证
    ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel 
    #wang用户只能再指定ip地址内使用root授权命令
    wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd
    

PAM

pam简介

  • pam说明

    PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活便利的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。
    在不同版本的Linux统中部署PAM认证是有所不同的。
    它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。
    系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要是引出一些函数pam_sm_xxxx( )供PAM接口库调用),将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来
    
  • PAM框架结构如图所示

    image-20220916090839563

  • 官网地址

    http://www.linux-pam.org/
    
  • 帮助文档

    官方在线文档:http://www.linux-pam.org/Linux-PAM-html/
    官方离线文档:http://www.linux-pam.org/documentation/
    

PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证。
  • 认证原理图如下图所示:

    image-20220916091531696

  • 认证过程讲解

    1.使用者执行/usr/bin/passwd 程序,并输入密码
    2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
    3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
    4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
    

PAM 配置文件格式说明

  • 通用配置文件/etc/pam.conf格式,此格式不使用

    application type control module-path arguments
    
  • 专用配置文件/etc/pam.d/ 格式

    type control module-path arguments
    
    • application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务
    • type:指模块类型,即功能
    • control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
    • module-path: 用来指明本模块对应的程序文件的路径名
    • Arguments: 用来传递给该模块的参数

模块类型

[09:37:39 root@rocky8_12 ~]#vim /etc/pam.d/sshd 
	#type		#Control	#path
  1 #%PAM-1.0
  2 auth       substack     password-auth
  3 auth       include      postlogin
  4 account    required     pam_sepermit.so
  5 account    required     pam_nologin.so
  6 account    include      password-auth
  7 password   include      password-auth
  8 # pam_selinux.so close should be the first session rule
  9 session    required     pam_selinux.so close
 10 session    required     pam_loginuid.so
 11 # pam_selinux.so open should only be followed by sessions to be executed in the user context
 12 session    required     pam_selinux.so open env_params
 13 session    required     pam_namespace.so
 14 session    optional     pam_keyinit.so force revoke
 15 session    optional     pam_motd.so
 16 session    include      password-auth
 17 session    include      postlogin

module-type

  • Auth 账号的认证和授权
  • Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
  • Password 用户修改密码时密码复杂度检查机制等功能
  • Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
  • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用

module-Control

  • required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
  • requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
  • sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的required和requisite
  • optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
  • include: 调用其他的配置文件中定义的配置信息

module-path

  • 模块文件所在绝对路径:
  • 模块文件所在相对路径:/lib64/security目录下的模块可使用相对路径,如:pam_shells.so、pam_limits.so
  • 有些模块有自已的专有配置文件,在/etc/security/*.conf目 录下

Arguments

  • debug :该模块应当用syslog( )将调试信息写入到系统日志文件中
  • no_warn :表明该模块不应把警告信息发送给应用程序
  • use_first_pass :该模块不能提示用户输入密码,只能从前一个模块得到输入密码
  • try_first_pass :该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户输入新密码
  • use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码
  • expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁

执行过程总结概括

程序调用 → pam配置文件:/etc/pam.d/  →  通过配置文件调用模块:/usr/lib64/security/  →  如果复杂模块会有专门配置文件进行配置:/etc/security/

image-20220916154054957

image-20220916154146452

image-20220916154239450

模块使用案例

pam_nologin.so 模块

  • 简介

    功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文
    件内容,并拒绝登陆
    
  • 查看哪些程序使用nologin模块

    [15:24:54 root@rocky8_31 ~]#cd /etc/pam.d/
    [15:26:24 root@rocky8_31 pam.d]#grep pam_nologin *
    cockpit:account    required     pam_nologin.so
    gdm-autologin:account    required    pam_nologin.so
    gdm-fingerprint:account     required      pam_nologin.so
    gdm-password:account     required      pam_nologin.so
    gdm-pin:account     required      pam_nologin.so
    gdm-smartcard:account     required      pam_nologin.so
    login:account    required     pam_nologin.so
    remote:account    required     pam_nologin.so
    sshd:account    required     pam_nologin.so
    vmtoolsd:account    required     pam_nologin.so
    
  • 验证nologin模块功能

    [D:\~]$ ssh zxl@192.168.100.31
    
    
    Connecting to 192.168.100.31:22...
    Connection established.
    To escape to local shell, press Ctrl+Alt+].
    非root用户不能登录
    
    Connection closing...Socket close.
    
    Connection closed by foreign host.
    
    Disconnected from remote host(192.168.100.31:22) at 15:32:32.
    
    Type `help' to learn how to use Xshell prompt.
    
    [D:\~]$ ssh root@192.168.100.31
    
    
    Connecting to 192.168.100.31:22...
    Connection established.
    To escape to local shell, press Ctrl+Alt+].
    
    非root用户不能登录
    
    Activate the web console with: systemctl enable --now cockpit.socket
    
    This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
    To register this system, run: insights-client --register
    
    Last login: Fri Sep 16 15:24:54 2022 from 192.168.100.1
    

pam_limits.so 模块

  • 简介

    功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用
    内存空间
    

    image-20220916161300646

  • 查看哪些程序使用limits模块

    [15:57:22 root@rocky8_31 ~]#grep  pam_limits /etc/pam.d/*
    /etc/pam.d/fingerprint-auth:session     required                                     pam_limits.so
    /etc/pam.d/password-auth:session     required                                     pam_limits.so
    /etc/pam.d/runuser:session		required	pam_limits.so
    /etc/pam.d/system-auth:session     required                                     pam_limits.so
    
    
  • 验证limit模块功能

    • 查看用户默认资源

      [16:08:43 root@rocky8_31 ~]#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) 10972
      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) 10972
      virtual memory          (kbytes, -v) unlimited
      file locks                      (-x) unlimited
      
    • ulimit命令

      • 说明

        ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。
        ulimit的设定值是 per-process 的,也就是说,每个进程有自己的limits值。
        使用ulimit进行修改,立即生效。
        ulimit只影响shell进程及其子进程,用户登出后失效。
        可以在profile中加入ulimit的设置,变相的做到永久生效。
        
      • 命令参数

        -H 设置硬件资源限制.
        -S 设置软件资源限制.
        -a 显示当前所有的资源限制.
        -c size:设置core文件的最大值.单位:blocks
        -d size:设置数据段的最大值.单位:kbytes
        -f size:设置创建文件的最大值.单位:blocks
        -l size:设置在内存中锁定进程的最大值.单位:kbytes
        -m size:设置可以使用的常驻内存的最大值.单位:kbytes
        -n size:设置内核可以同时打开的文件描述符的最大值.单位:n
        -p size:设置管道缓冲区的最大值.单位:kbytes
        -s size:设置堆栈的最大值.单位:kbytes
        -t size:设置CPU使用时间的最大上限.单位:seconds
        -u size:最大用户进程数
        -v size:设置虚拟内存的最大值.单位:kbytes
        unlimited 是一个特殊值,用于表示不限制
        #说明
        查询时,若不加H或S参数,默认显示的是软限制
        修改时,若不加H或S参数,两个参数一起改变
        
    • 临时修改limit资源

      16:44:31 root@rocky8_31 ~]#ulimit -u
      10972
      You have new mail in /var/spool/mail/root
      [17:03:59 root@rocky8_31 ~]#ulimit -u 5000
      [17:04:28 root@rocky8_31 ~]#ulimit -u 
      5000
      
    • 永久修改limit资源

      [17:04:32 root@rocky8_31 ~]#vim /etc/security/limits.conf 
      [17:06:35 root@rocky8_31 ~]#grep ^[*] /etc/security/limits.conf
      *                soft    core            unlimited
      *                hard    core            unlimited
      *                soft    nproc           1000000
      *                hard    nproc           1000000
      *                soft    nofile          1000000
      *                hard    nofile          1000000
      *                soft    memlock         32000
      *                hard    memlock         32000
      *                soft    msgqueue        8192000
      *                hard    msgqueue        8192000
      #退出当前窗口重新登录
      [17:07:46 root@rocky8_31 ~]#ulimit -a
      core file size          (blocks, -c) unlimited
      data seg size           (kbytes, -d) unlimited
      scheduling priority             (-e) 0
      file size               (blocks, -f) unlimited
      pending signals                 (-i) 10972
      max locked memory       (kbytes, -l) 32000
      max memory size         (kbytes, -m) unlimited
      open files                      (-n) 1000000
      pipe size            (512 bytes, -p) 8
      POSIX message queues     (bytes, -q) 8192000
      real-time priority              (-r) 0
      stack size              (kbytes, -s) 8192
      cpu time               (seconds, -t) unlimited
      max user processes              (-u) 1000000
      virtual memory          (kbytes, -v) unlimited
      file locks                      (-x) unlimited
      
    • 配置文件

      • pam_limits的设定值是基于 per-process 的

        /etc/security/limits.conf
        /etc/security/limits.d/*.conf
        
      • 文件格式

        #每行一个定义
        <domain> <type> <item> <value>
        
      • 格式说明:

        Username 单个用户
        @group 组内所有用户
        * 所有用户
        % 仅用于限制 maxlogins limit , 可以使用 %group 语法. 只用 % 相当于 * 对所有用户
        maxsyslogins limit限制. %group 表示限制此组中的所有用户总的最大登录数
        
      • 限制的类型

        Soft 软限制,普通用户自己可以修改
        Hard 硬限制,由root用户设定,且通过kernel强制生效
        - 二者同时限定
        
      • 限制的资源

        nofile 所能够同时打开的最大文件数量,默认为1024
        nproc 所能够同时运行的进程的最大数量,默认为1024
        

    通过systemd服务

标签:SUDO,规范,PAM,etc,so,模块,root,pam
From: https://www.cnblogs.com/zxl1024320609/p/16834625.html

相关文章

  • Pycharm 如何自动调整 Python 代码符合 pep8 编码规范
    前言学生时代,写的一手漂亮的好字,能给人留下好的印象。作为IT人,写的一手漂亮的代码也会给人留下美好的印象。代码就是自己的脸面,不管写质量怎样,首先要写的漂亮。Python......
  • 袋鼠云平台代码规范化编译部署的提效性改进实践
    一、前言作为全链路数字化技术与服务提供商,袋鼠云提供了从数据湖、大数据基础平台、离线开发、实时开发、数据服务、数据治理、指标管理、客户数据洞察、数据孪生可视化等......
  • Redis开发规范与性能优化
    目录一、键值设计二、命令使用三、客户端使用四、系统内核参数优化一、键值设计1.key名设计【建议】可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号......
  • es6代码规范
    1、关于取值取值在程序中非常常见,比如从对象obj中取值。constobj={a:1,b:2,c:3,d:4,e:5,}吐槽写法:consta=obj.a;constb=obj.b......
  • Vue学习笔记之Vue文件书写规范
    0x00概述本文转载,原文 0x01template模块1.1<template> 标签上不要写多余的属性(默认就是以html来解析)<!--Notrecommended--><templatelang="html"></temp......
  • 给用户赋予sudo权限
    Linux赋予用户sudo权限前言现如今,在许多Linux发行版中,普通用户默认是完全不具备sudo权限的,虽是处于安全考量,但如果是个人主机或服务器,在日常使用中还是会有诸多不变......
  • 简述Shell编写规范与变量的定义
    1  shell脚本1.1shell脚本的概述将要执行的命令按顺序保存到一个文本文件给该文件可执行权限课结合各种shell控制语句以完成更复杂的操作shell是一个面向字符......
  • C++/C 规范:命名规范和注释
    变量变量命名里面只能是名词,不能有动词宏:全部大写,如:FRAME_SIZE变量:驼峰命名规则,首个单词小写,如:myFrameSize全局变量:在变量前后添加字母G,如:myFrameSizeG函数尽量......
  • sudo: no tty present and no askpass program specified(sudo问题)
    解决办法:vim /etc/sudoers#Defaults    requiretty  注释掉这个zabbix  ALL=(ALL)      NOPASSWD: ALL 添加此行......
  • 注释规范
    前言最近感觉自己代码写得有点乱,就想着规范一下。写这个就是保存一下,以后方便拿来用。头文件注释/**************************************************************......