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到本机;

评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用