mini Linux的制作,rsyslog系统日志,pam和nss(第25天)
Mini Linux的制作
CentOS 6的启动流程如下:
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
init程序启动/etc/rc.d/init.d/目录里的脚本来启动各个程序 SysV风格,这些服务脚本可以自己编写。
/etc/inittab文件的作用:
默认运行级别
运行系统初始化脚本:/etc/rc.d/rc.sysinit
/etc/rc.d/rc $runlevel 如果runlevel为0,就运行/etc/rc.d/rc0/目录里的脚本(k开头的被stop,s开头的被start)
启动终端,并运行login
启动图形终端
upstart程序通过/etc/init/*.conf里的配置文件来启动各个程序(使用exec来启动各个程序)
CentOS 7的启动流程如下:
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd systemd是一个大管家
CentOS 7 编写Systemd unit文件
bootloader有如下几种:
lilo
grub legacy
grub 2:第一阶段位于MBR中,第1.5阶段用来识别文件系统,第2阶段是主程序
内核编译的步骤:
make menuconfig 生成 .config 文件
make [-j #]
make modules_install
make install
复制程序及其依赖的库文件脚本示例:
#!/bin/bash
#
target=/mnt/sysroot
[ -d $target ] || mkdir /mnt/sysroot
read -p "A command: " command
libcp() {
for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
libdir=$(dirname $lib)
[ -d $target$libdir ] || mkdir -p $target$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
}
while [ "$command" != 'quit' ]; do
if ! which $command &> /dev/null; then
read -p "No such command, enter again: " command
continue
fi
command=$(which --skip-alias $command)
cmnddir=$(dirname $command)
[ -d $target$cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
read -p "Another command(quit): " command
done
自己编译一个mini linux:
bootloader程序使用grub
内核:kernel (非模块方式,也就是所有的驱动都编译进去内核文件里)
根文件系统:使用busybox(Busybox在单一的可执行文件中提供了精简的Unix工具集,可运行于多款POSIX环境的操作系统,例如Linux(包括Android[6])、Hurd[7]、FreeBSD[8][9]等等)
Mini Linux: kernel+busybox
busybox: 静态方式编译,依赖于glibc-static;
编译单个内核模块:
# cd /usr/src/linux
# make M=drivers/net/ethernet/intel/e1000/
# make M=path/to/somedir/
--------------------------------华丽的分割线-------------------------------------------
Linux的日志系统:
日志:历史日志,用来记录历史事件,记录什么时间,发生什么事件
日志级别:事件的关键性程度,Loglevel
系统日志服务:syslog+rsyslog
syslog:
syslogd: 该进程为用户空间的进程记录日志
klogd: 该进程为内核空间的进程记录日志
rsyslog: CentOS 6使用的系统日志
syslogd 该进程为用户空间的进程记录日志
klogd 该进程为内核空间的进程记录日志
rsyslog:是syslog的升级版本,有如下的特性:
rsyslog是多线程的;
rsyslog支持UDP, TCP协议,, 支持SSL, TLS加密, 支持RELP协议;
rsyslog支持在MySQL, PostgreSQL, Oralce实现日志存储(将日志记录存储到数据库中);
rsyslog支持强大的过滤器,可实现过滤日志信息中任何部分;
rsyslog支持自定义输出格式
rsyslog支持集中日志记录
OpenSSH可以配置为使用rsyslog记录日志或者软件自己记录日志。
elasticsearch是分布式日志存储系统,支持搜索
logstash是日志收集器
kibana 前端日志展示工具
以上三个合称elk
日志收集方:
facility:日志设施,从功能或程序上对日志进行分类;facility有如下的多种类型:auth(认证),authpriv(认证授权), cron, daemon(为守护进程记录日志), kern(内核), lpr(打印), mail, mark(标记相关), news(新闻组), security, user, uucp(uucp协议相关), local0-local7(用户自定义的日志设施), syslog
priority:日志级别,有如下几种日志级别:debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
指定日志级别:
*: 所有级别
none: 没有级别
priority: 此级别及更高级别的日志信息都会被记录
=priority:此级别
日志的记录格式:
facility.priority /var/log/messages
例子:
authpriv.err /var/log/messages 表示认证授权相关的,日志级别err及以上的日志记录到/var/log/messages文件中
rsyslog的程序环境:(rpm -ql rsyslog)
主程序:/usr/sbin/rsyslogd
配置文件:/etc/rsyslog.conf
服务脚本:/etc/rc.d/init.d/rsyslog (CentOS 7没有该文件)
/etc/rsyslog.conf 配置文件详解:
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) rsyslog加载的模块
$ModLoad imjournal # provides access to the systemd journal rsyslog加载的模块
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514 监听在UDP 514端口
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514 监听在TCP 514端口
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 #kern.* /dev/console 内核日志记录到/dev/console
(在/var/log/dmesg文件中记录了本次系统启动时产生的日志信息,使用dmesg命令可以查看该文件的内容。)
54 *.info;mail.none;authpriv.none;cron.none /var/log/messages 表示除了mail,authpriv,cron设施之外的所有设施的info级别以及以上的日志都记录到/var/log/messages文件中
57 authpriv.* /var/log/secure 认证授权相关的所有级别的日志记录到 /var/log/secure文件中。
60 mail.* -/var/log/maillog -表示异步写入
64 cron.* /var/log/cron
67 *.emerg :omusrmsg:* 表示Everybody gets emergency messages
70 uucp,news.crit /var/log/spooler 表示Save news errors of level crit and higher in a special file.
73 local7.* /var/log/boot.log
rsyslog.conf配置文件的总结:
记录的RULES形式如下:
facility.priority target
其中target可以的取值有:
文件路径:记录于指定的日志文件中,通常应该在/var/log目录下;文件路径前的“-”表示异步写入;
用户:将日志通知给指定用户,其中 * 表示所有用户
日志服务器:@host,其中host必须要监听在tcp或udp协议514端口上提供服务,表示将日志发送给host;
管道: |COMMAND
日志文件的格式如下:(tail /var/log/messages)
事件产生的日期时间 主机 进程(pid): 事件内容
有些日志记录为二进制格式:/var/log/wtmp,/var/log/btmp
/var/log/wtmp: 当前系统上成功登录的日志;last命令可以查看
/var/log/btmp:当前系统上失败的登录尝试;lastb命令可以查看
lastlog命令:显示当前系统每一个用户最近一次的登录时间;
rsyslog作为服务器的配置:
rsyslog可以启动起来监听在端口上,接收别的主机发送过来的日志信息,需要修改配置文件/etc/rsyslog.conf文件,将如下的内容的注释取消掉即可:
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
打开这些配置之后,就可以让本机器接收其他主机发送过来的日志信息。
配置rsyslog日志系统使用mysql存储日志信息:
(1) 准备好MySQL服务器,创建用户,授权对Syslog数据库的全部访问权限;
GRANT ALL ON Syslog.* TO 'syslog'@'%' IDENTIFIED BY 'syslogpass'
(2) 安装rsyslog-mysql程序包;yum install rsyslog-myql ,安装完成之后生成/usr/share/doc/rsyslog-mysql-VERSION/createDB.sql文件和/lib64/rsyslog/ommysql.so文件
(3) 创建rsyslog-mysql依赖的数据库;
# mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-VERSION/createDB.sql
(4) 编辑/etc/rsyslog.conf文件使用ommysql模块
#### MODULES ####
$ModLoad ommysql
#### RULES ####
facility.priority :ommysql:DBHOST,DATABASE,DBUSER,USERPASS
重启rsyslog服务
(5) 安装loganalyzer, loganalyzer是php编写的应用程序
(a) 配置webserver, 支持php
# yum install httpd php php-mysql php-gd
# service httpd start
(b) 安装loganalyzer的步骤如下:
# cp -r loganalyzer-3.6.5/src /var/www/html/loganalyzer
# cp loganalyzer-3.6.5/contrib/*.sh /var/www/html/loganalyzer
# cd /var/www/html/loganalyzer
# chmod +x *.sh
# ./configure.sh
# ./secure.sh
# chmod 666 config.php
----------------------------------------华丽的分割线--------------------------------------
nsswitch和pam:
名称解析:将name形式转化为id形式
认证服务:
nsswitch: network service switch 网络服务转换,主要用于对名称进行解析,将名称解析成数字形式,所以必须依赖一个解析库,解析库可以是文件、MySQL、NIS、LDAP、DNS等。所以nsswitch必须提供对于这些存储介质的支持和实现。这就意味着nsswitch类似于一个框架。
nsswitch为本地的程序提供解析名称的服务,nsswitch本身实现了和各个存储介质的交互,然后它在向上提供接口给本地的程序调用。
nsswitch事实上也是一个通用框架,与各存储交互的实现依赖于如下的类库:
/usr/lib64/libnss*, /lib64/libnss*
例如:
nsswitch的配置文件/etc/nsswitch.conf:
该配置文件的部分内容:
passwd: files sss 这里passwd表示数据库(database),files表示解析库(意思是说解析库存储在文件中)
shadow: files sss 同上
group: files sss 同上
总结格式:
db: stroe1,store2,...
每种存储中查找的结果状态:STATUS => success | notfound | unavail | tryagain
对应于每种状态参数的行为:ACTION => return | continue
举个栗子:
host: files nis [NOTFOUND=return] dns 表示首先找file,如果file里找不到,就找找nis,nis里如果找不到直接返回。
getent命令:get entries from Name Service Switch libraries
# getent database [entry]
例如:
getent passwd root
getent services http
pam:pluggable authentication module
插入式认证模块
认证库:支持文件、MySQL、LDAP、NIS
通用框架,与各存储交互的实现,以及多种辅助性(授权)功能:这些功能的实现位于 /lib64/security/*
pam的配置文件如下:
/etc/pam.conf
/etc/pam.d/*
通常每个应用使用一个单独的配置文件,这个文件位于/etc/pam.d/目录下,例如下图的内容来自于/etc/pam.d/system-auth-ac文件:
配置文件中每行定义一种检查规则;
检查规则的格式如下:
type control module-path module-arguments
type:检查功能类别,主要的列别有如下几种:
auth: 账号的认证和授权
account:与账号管理相关的非认证功能
password:用户修改密码时密码检查规则
session:用户获取到服务之前或使用服务完成之后要进行的一些附加性操作
control:同一种功能的多个检查之间如何进行组合;
有两种实现机制(简单机制和复杂机制):
1、使用一个关键词来定义;例如sufficient,required, requisite;
2、使用一或多个“status=action”形式的组合表示
简单机制有如下几种:
required 需要的(没有一票通过权,也没有一票否决权),表示如果这一行的规则通过,后面的规则还要检查,如果这一行的规则通不过,结果一定是过不了,但是后面的规则也要检查
requisite 必要的(具有一票否决权),表示如果这一行的规则通过,后面的规则还要检查,如果这一行的规则通不过,后面的规则直接不用继续检查了,直接通不过。
sufficient 足够的(具有一票通过权)表示如果这一行的规则通过,后面的规则不要检查了,直接通过,如果这一行的规则通不过,最后的结果取决于其他行的规则。
optional 可选的
include 包含,表示将include后面的文件中同一类别的检查规则行包含进来
复杂机制:[status1=action1 status2=action2 ....]
status:表示返回状态,
action: 表示动作,有ok, done, die, ignore, bad, reset
module-path: 表示引用的模块路径
/lib64/security: 此目录下的模块引用时可使用相对路径;
module-arguments: 表示模块运行时,传递给模块的模块参数
pam模块解析:
(1) pam_shells.so
比如要给ssh服务添加安全shell,步骤如下:
编辑/etc/pam.d/sshd文件,把如下的内容加入到文件的第一行:
auth required pam_shells.so
这样一来,就表示通过ssh协议登录系统的用户所使用的shell,必须是/etc/shells文件中的其中一个。
(2) pam_limits.so
该模块通过读取配置文件完成用户对系统资源的使用控制
该模块的配置文件:
/etc/security/limits.conf
/etc/security/limits.d/*
该配置文件的格式如下:
<domain> <type> <item> <value>
<domain>的取值有如下:
username
@group
*: 所有用户
<type>的取值有如下:
soft:软限制,用户可以自行修改
hard:硬限制,由root设定,通过kernel强制生效;
-:二者同时限定;
<item>表示对哪类资源做限制,取值有如下:
nofile: 所能够同时打开的最大文件数量;
nproc: 所能够同时运行的最大进程数量;
msqqueue:使用的POSIX消息队列能够占用的最大内存空间;
sigpending:所能够使用的最大信号数量;
<value> 表示<item>的数量
例子:编辑/etc/security/limits.conf文件,加入如下内容:
apache - nofile 20000 表示限制apache用户,打开的最大文件数量20000
ulimit -n #:文件数量
ulimit -u #:进程数量
练习:
(1) 限制centos用户只能够在worktime通过ssh远程连接本机;
(2) 限制只有distro组内的用户可ssh到本机;
CentOS 6的启动流程如下:
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
init程序启动/etc/rc.d/init.d/目录里的脚本来启动各个程序 SysV风格,这些服务脚本可以自己编写。
/etc/inittab文件的作用:
默认运行级别
运行系统初始化脚本:/etc/rc.d/rc.sysinit
/etc/rc.d/rc $runlevel 如果runlevel为0,就运行/etc/rc.d/rc0/目录里的脚本(k开头的被stop,s开头的被start)
启动终端,并运行login
启动图形终端
upstart程序通过/etc/init/*.conf里的配置文件来启动各个程序(使用exec来启动各个程序)
CentOS 7的启动流程如下:
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd systemd是一个大管家
CentOS 7 编写Systemd unit文件
bootloader有如下几种:
lilo
grub legacy
grub 2:第一阶段位于MBR中,第1.5阶段用来识别文件系统,第2阶段是主程序
内核编译的步骤:
make menuconfig 生成 .config 文件
make [-j #]
make modules_install
make install
复制程序及其依赖的库文件脚本示例:
#!/bin/bash
#
target=/mnt/sysroot
[ -d $target ] || mkdir /mnt/sysroot
read -p "A command: " command
libcp() {
for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
libdir=$(dirname $lib)
[ -d $target$libdir ] || mkdir -p $target$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
}
while [ "$command" != 'quit' ]; do
if ! which $command &> /dev/null; then
read -p "No such command, enter again: " command
continue
fi
command=$(which --skip-alias $command)
cmnddir=$(dirname $command)
[ -d $target$cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
read -p "Another command(quit): " command
done
自己编译一个mini linux:
bootloader程序使用grub
内核:kernel (非模块方式,也就是所有的驱动都编译进去内核文件里)
根文件系统:使用busybox(Busybox在单一的可执行文件中提供了精简的Unix工具集,可运行于多款POSIX环境的操作系统,例如Linux(包括Android[6])、Hurd[7]、FreeBSD[8][9]等等)
Mini Linux: kernel+busybox
busybox: 静态方式编译,依赖于glibc-static;
编译单个内核模块:
# cd /usr/src/linux
# make M=drivers/net/ethernet/intel/e1000/
# make M=path/to/somedir/
--------------------------------华丽的分割线-------------------------------------------
Linux的日志系统:
日志:历史日志,用来记录历史事件,记录什么时间,发生什么事件
日志级别:事件的关键性程度,Loglevel
系统日志服务:syslog+rsyslog
syslog:
syslogd: 该进程为用户空间的进程记录日志
klogd: 该进程为内核空间的进程记录日志
rsyslog: CentOS 6使用的系统日志
syslogd 该进程为用户空间的进程记录日志
klogd 该进程为内核空间的进程记录日志
rsyslog:是syslog的升级版本,有如下的特性:
rsyslog是多线程的;
rsyslog支持UDP, TCP协议,, 支持SSL, TLS加密, 支持RELP协议;
rsyslog支持在MySQL, PostgreSQL, Oralce实现日志存储(将日志记录存储到数据库中);
rsyslog支持强大的过滤器,可实现过滤日志信息中任何部分;
rsyslog支持自定义输出格式
rsyslog支持集中日志记录
OpenSSH可以配置为使用rsyslog记录日志或者软件自己记录日志。
elasticsearch是分布式日志存储系统,支持搜索
logstash是日志收集器
kibana 前端日志展示工具
以上三个合称elk
日志收集方:
facility:日志设施,从功能或程序上对日志进行分类;facility有如下的多种类型:auth(认证),authpriv(认证授权), cron, daemon(为守护进程记录日志), kern(内核), lpr(打印), mail, mark(标记相关), news(新闻组), security, user, uucp(uucp协议相关), local0-local7(用户自定义的日志设施), syslog
priority:日志级别,有如下几种日志级别:debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
指定日志级别:
*: 所有级别
none: 没有级别
priority: 此级别及更高级别的日志信息都会被记录
=priority:此级别
日志的记录格式:
facility.priority /var/log/messages
例子:
authpriv.err /var/log/messages 表示认证授权相关的,日志级别err及以上的日志记录到/var/log/messages文件中
rsyslog的程序环境:(rpm -ql rsyslog)
主程序:/usr/sbin/rsyslogd
配置文件:/etc/rsyslog.conf
服务脚本:/etc/rc.d/init.d/rsyslog (CentOS 7没有该文件)
/etc/rsyslog.conf 配置文件详解:
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) rsyslog加载的模块
$ModLoad imjournal # provides access to the systemd journal rsyslog加载的模块
#$ModLoad imudp
#$UDPServerRun 514 监听在UDP 514端口
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514 监听在TCP 514端口
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 #kern.* /dev/console 内核日志记录到/dev/console
(在/var/log/dmesg文件中记录了本次系统启动时产生的日志信息,使用dmesg命令可以查看该文件的内容。)
54 *.info;mail.none;authpriv.none;cron.none /var/log/messages 表示除了mail,authpriv,cron设施之外的所有设施的info级别以及以上的日志都记录到/var/log/messages文件中
60 mail.* -/var/log/maillog -表示异步写入
64 cron.* /var/log/cron
67 *.emerg :omusrmsg:* 表示Everybody gets emergency messages
70 uucp,news.crit /var/log/spooler 表示Save news errors of level crit and higher in a special file.
73 local7.* /var/log/boot.log
rsyslog.conf配置文件的总结:
记录的RULES形式如下:
facility.priority target
其中target可以的取值有:
文件路径:记录于指定的日志文件中,通常应该在/var/log目录下;文件路径前的“-”表示异步写入;
用户:将日志通知给指定用户,其中 * 表示所有用户
日志服务器:@host,其中host必须要监听在tcp或udp协议514端口上提供服务,表示将日志发送给host;
管道: |COMMAND
日志文件的格式如下:(tail /var/log/messages)
事件产生的日期时间 主机 进程(pid): 事件内容
有些日志记录为二进制格式:/var/log/wtmp,/var/log/btmp
/var/log/wtmp: 当前系统上成功登录的日志;last命令可以查看
/var/log/btmp:当前系统上失败的登录尝试;lastb命令可以查看
lastlog命令:显示当前系统每一个用户最近一次的登录时间;
rsyslog作为服务器的配置:
rsyslog可以启动起来监听在端口上,接收别的主机发送过来的日志信息,需要修改配置文件/etc/rsyslog.conf文件,将如下的内容的注释取消掉即可:
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
打开这些配置之后,就可以让本机器接收其他主机发送过来的日志信息。
配置rsyslog日志系统使用mysql存储日志信息:
(1) 准备好MySQL服务器,创建用户,授权对Syslog数据库的全部访问权限;
GRANT ALL ON Syslog.* TO 'syslog'@'%' IDENTIFIED BY 'syslogpass'
(2) 安装rsyslog-mysql程序包;yum install rsyslog-myql ,安装完成之后生成/usr/share/doc/rsyslog-mysql-VERSION/createDB.sql文件和/lib64/rsyslog/ommysql.so文件
(3) 创建rsyslog-mysql依赖的数据库;
# mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-VERSION/createDB.sql
(4) 编辑/etc/rsyslog.conf文件使用ommysql模块
#### MODULES ####
$ModLoad ommysql
#### RULES ####
facility.priority :ommysql:DBHOST,DATABASE,DBUSER,USERPASS
重启rsyslog服务
(5) 安装loganalyzer, loganalyzer是php编写的应用程序
(a) 配置webserver, 支持php
# yum install httpd php php-mysql php-gd
# service httpd start
(b) 安装loganalyzer的步骤如下:
# cp -r loganalyzer-3.6.5/src /var/www/html/loganalyzer
# cp loganalyzer-3.6.5/contrib/*.sh /var/www/html/loganalyzer
# cd /var/www/html/loganalyzer
# chmod +x *.sh
# ./configure.sh
# ./secure.sh
# chmod 666 config.php
----------------------------------------华丽的分割线--------------------------------------
nsswitch和pam:
名称解析:将name形式转化为id形式
认证服务:
nsswitch: network service switch 网络服务转换,主要用于对名称进行解析,将名称解析成数字形式,所以必须依赖一个解析库,解析库可以是文件、MySQL、NIS、LDAP、DNS等。所以nsswitch必须提供对于这些存储介质的支持和实现。这就意味着nsswitch类似于一个框架。
nsswitch为本地的程序提供解析名称的服务,nsswitch本身实现了和各个存储介质的交互,然后它在向上提供接口给本地的程序调用。
nsswitch事实上也是一个通用框架,与各存储交互的实现依赖于如下的类库:
/usr/lib64/libnss*, /lib64/libnss*
例如:
nsswitch的配置文件/etc/nsswitch.conf:
该配置文件的部分内容:
passwd: files sss 这里passwd表示数据库(database),files表示解析库(意思是说解析库存储在文件中)
shadow: files sss 同上
group: files sss 同上
总结格式:
db: stroe1,store2,...
每种存储中查找的结果状态:STATUS => success | notfound | unavail | tryagain
对应于每种状态参数的行为:ACTION => return | continue
举个栗子:
host: files nis [NOTFOUND=return] dns 表示首先找file,如果file里找不到,就找找nis,nis里如果找不到直接返回。
getent命令:get entries from Name Service Switch libraries
# getent database [entry]
例如:
getent passwd root
getent services http
pam:pluggable authentication module
插入式认证模块
认证库:支持文件、MySQL、LDAP、NIS
通用框架,与各存储交互的实现,以及多种辅助性(授权)功能:这些功能的实现位于 /lib64/security/*
pam的配置文件如下:
/etc/pam.conf
/etc/pam.d/*
通常每个应用使用一个单独的配置文件,这个文件位于/etc/pam.d/目录下,例如下图的内容来自于/etc/pam.d/system-auth-ac文件:
配置文件中每行定义一种检查规则;
检查规则的格式如下:
type control module-path module-arguments
type:检查功能类别,主要的列别有如下几种:
auth: 账号的认证和授权
account:与账号管理相关的非认证功能
password:用户修改密码时密码检查规则
session:用户获取到服务之前或使用服务完成之后要进行的一些附加性操作
control:同一种功能的多个检查之间如何进行组合;
有两种实现机制(简单机制和复杂机制):
1、使用一个关键词来定义;例如sufficient,required, requisite;
2、使用一或多个“status=action”形式的组合表示
简单机制有如下几种:
required 需要的(没有一票通过权,也没有一票否决权),表示如果这一行的规则通过,后面的规则还要检查,如果这一行的规则通不过,结果一定是过不了,但是后面的规则也要检查
requisite 必要的(具有一票否决权),表示如果这一行的规则通过,后面的规则还要检查,如果这一行的规则通不过,后面的规则直接不用继续检查了,直接通不过。
sufficient 足够的(具有一票通过权)表示如果这一行的规则通过,后面的规则不要检查了,直接通过,如果这一行的规则通不过,最后的结果取决于其他行的规则。
optional 可选的
include 包含,表示将include后面的文件中同一类别的检查规则行包含进来
复杂机制:[status1=action1 status2=action2 ....]
status:表示返回状态,
action: 表示动作,有ok, done, die, ignore, bad, reset
module-path: 表示引用的模块路径
/lib64/security: 此目录下的模块引用时可使用相对路径;
module-arguments: 表示模块运行时,传递给模块的模块参数
pam模块解析:
(1) pam_shells.so
比如要给ssh服务添加安全shell,步骤如下:
编辑/etc/pam.d/sshd文件,把如下的内容加入到文件的第一行:
auth required pam_shells.so
这样一来,就表示通过ssh协议登录系统的用户所使用的shell,必须是/etc/shells文件中的其中一个。
(2) pam_limits.so
该模块通过读取配置文件完成用户对系统资源的使用控制
该模块的配置文件:
/etc/security/limits.conf
/etc/security/limits.d/*
该配置文件的格式如下:
<domain> <type> <item> <value>
<domain>的取值有如下:
username
@group
*: 所有用户
<type>的取值有如下:
soft:软限制,用户可以自行修改
hard:硬限制,由root设定,通过kernel强制生效;
-:二者同时限定;
<item>表示对哪类资源做限制,取值有如下:
nofile: 所能够同时打开的最大文件数量;
nproc: 所能够同时运行的最大进程数量;
msqqueue:使用的POSIX消息队列能够占用的最大内存空间;
sigpending:所能够使用的最大信号数量;
<value> 表示<item>的数量
例子:编辑/etc/security/limits.conf文件,加入如下内容:
apache - nofile 20000 表示限制apache用户,打开的最大文件数量20000
ulimit -n #:文件数量
ulimit -u #:进程数量
练习:
(1) 限制centos用户只能够在worktime通过ssh远程连接本机;
(2) 限制只有distro组内的用户可ssh到本机;
评论
发表评论