lLinux系统安全sudo+pam

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

ULA

安全

调优

虚拟化

存储

集群



sudo 与 su

相同点:

使用普通帐号登录系统,避免直接误操作,降低root密码被泄漏风险


区别:

sudo 在使用普通帐号执行管理操作的时候,euid的身份可以是任何身份(根据配置文件设定),切换到目标euid身份时候,输入的不是目标身份的密码,而是自身的密码。

tom ---sudo root--->输入的是tom自己的密码。

sudo会记录下所有通过sudo执行的任何操作。/var/log/secure



使用sudo

# visudo 编辑配置文件 <---建议: 工具能够自动识别语法是否正确是否有效。

或者 自己 # vim /etc/sudoers <---不建议


真实身份 在哪里=(euid)允许的操作

webadmin ALL=(root)ALL

tom ALL=(root)ALL,!/sbin/fdisk

maryALL=/sbin/ifconfig,/sbin/fdisk,/sbin/route





[mary@www ~]$ sudo fdisk /dev/sda

[sudo] password for mary:


[tom@www ~]$ route add default gw 10.1.1.1

SIOCADDRT: 不允许的操作

[tom@www ~]$ sudo route add default gw 10.1.1.1

[sudo] password for tom:





拒绝root远程登录ssh,只允许普通帐号登录ssh,然后登录后可以sudo执行一些管理操作。


sudo

降低误操作的机会。

在执行一些管理操作的时候,输入自己的密码

所有操作都会记录下来 /var/log/secure


ssh --> :

man ssh

man sshd --> 得到 man sshd_config


# vim /etc/ssh/sshd_config

PermitRootLogin no


# service sshd restart


# useradd tomadmin

# passwd tomadmin 设定一个复杂的密码


# visudo

tomadmin ALL=(root)ALL,!/bin/rm <---可以执行任何命令,但除了/bin/rm 命令






测试

ssh 10.1.1.21 -l tomadmin

sudo /sbin/fdisk 提示输入tomadmin的密码后,才能完成操作。



==============================================================


pam

可热插拔的验证模块




在rhel系统中,pam 的组成

配置文件/etc/pam.d/服务进程名字

模块/lib/security/<---32位系统存放模块的默认路径

/lib64/security/




四个阶段: 每个阶段完成用户验证和登录的不同功能


认证阶段auth: 对用户在登录的时候的用户名和密码的正确性进行判断


帐号阶段account : 判断用户是否已经被禁用,是否有效。

密码阶段 : 实现对密码的管控,例如修改密码,密码的复杂度控制

会话阶段 : 用户登录成功之后,会话就开始了,直到退出登录,整个过程都有该阶段的模块进行管控。



模块调用使用控制标记:


required必要条件。本条件必须通过,否则最后肯定是失败,如果该条件失败,并不会马上返回失败的结果,不会终止判断,而是把同一个阶段后续的剩下的各个模块还会继续判断,最后不管后续的模块结果如何,最终的结果还是失败。如果成功,那还会继续判断同一个阶段后续模块。


requisite必要条件。本条件必须通过,否则最后肯定是失败,如果该条件失败,会马上返回失败的结果,马上终止判断。如果成功,那还会继续判断同一个阶段后续模块。


sufficient充要条件。如果出现在它之前的必要条件都成立,而它也成立,那么马上终止判断,返回成功的结果。如果它本身验证失败,它马上会变成可选条件,不影响整个判断结果。


optional可选条件。 一般仅作记录日志

实际操作:现在对linux系统的登录程序login进行针对用户和时间的登录限制。

使用模块pam_time.so

一,检查某个程序是否支持pam

1、检查login程序是否支持PAM


  1. root@hdp0:~# ldd `which login` | grep libpam

  2. libpam.so.0 => /lib/libpam.so.0 (0xb76e2000)

  3. libpam_misc.so.0 => /lib/libpam_misc.so.0 (0xb76de000)

2、在/etc/pam.d/下修改login配置文件

在login配置文件中,在auth的定义之后,加入account的一条验证

account requisite pam_time.so

3、pam_time.so这个模块需要定义另外一个配置文件time.conf

在/etc/security/time.conf中定义限制的具体用户和时间


  1. vim /etc/security/time.conf

  2. login;tty3;fenix;Th2100-2300 //作用程序是login,作用在tty3上,fenix允许在周四2100-2300间登录

  3. login;!tty3;!fenix;!Th2100-2300 //作用程序是login,作用在tty3以外,对用户fenix之外产生影响,允许登录时间是周四2100-2300之外

4、对PAM的应用是立刻生效,可以切换到其他tty上进行测试。



例子1: 禁止所有普通用户本地登录系统



1、该功能是哪个程序完成,就能确定pam配置文件

/bin/login ---> /etc/pam.d/login


2、确定要完成这个验证功能需要使用哪个模块?<---学习pam的最终要的一点


可以通过查看本地所有的pam模块,通过它的名字来猜。

# find /usr/share/man -iname "pam_*"

/usr/share/man/man5/pam_env.conf.5.gz

/usr/share/man/man5/pam_krb5.5.gz

/usr/share/man/man3/pam_acct_mgmt.3.gz

...


# find /usr/share/man -iname "pam_*" | grep login

/usr/share/man/man8/pam_loginuid.8.gz

/usr/share/man/man8/pam_nologin.8.gz



# man pam_nologin


或者直接上网查询

或靠经验



3、根据模块的使用手册,编辑程序对应pam配置文件

注意:

模块应该在哪个阶段使用

模块应该用什么控制标记

顺序(需要根据模块的作用、控制标记来慎重选择)


shell> /etc/pam.d/login

#%PAM-1.0

auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so

auth include system-auth


account required pam_nologin.so <---注意顺序

account required pam_time.so

account include system-auth

。。。。



# touch /etc/nologin



实验完毕,记得把该文件删除,否则以后普通用户无法登录




例子2:root只能从安全终端登录

1、该功能是哪个程序完成,就能确定pam配置文件

/bin/login ---> /etc/pam.d/login


2、确定要完成这个验证功能需要使用哪个模块?<---学习pam的最终要的一点

# find /usr/share/man/ -iname "pam_*" | grep tty

/usr/share/man/man8/pam_tty_audit.8.gz

/usr/share/man/man8/pam_securetty.8.gz


shell> vim /etc/pam.d/login

#%PAM-1.0

auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so

默认就有

....


# cp /etc/securetty securetty.bak


# cat /etc/securetty

tty3 <---只保留tty3,那么root只能在tty3登录



例子3:限制登录时间


限制tom只能在上班时间0800-1800 ,ssh登录系统.


sshd --> /etc/pam.d/sshd ---> /etc/pam.d/system-auth 或者 password-auth


shell> vim /etc/pam.d/sshd

#%PAM-1.0

auth required pam_sepermit.so

auth required pam_tally2.so deny=3 unlock_time=180 even_deny_root

auth include password-auth

account required pam_time.so 《---必须在include system-auth

account include password-auth <---rhel5:是system-auth



# vim /etc/security/time.conf

sshd;*;tom;Wk0800-1800 & !Wd0000-2400



例子4:资源限制:squid、apache


命令临时在某个终端进行有限的控制,这个控制是直接在某个终端马上临时生效:

# ulimit -a

# ulimit -HSn 65536



如果想永久生效,就修改pam的对应的配置文件


# find /usr/share/man/ -iname "pam_*" | grep limit

/usr/share/man/man8/pam_limits.8.gz


# vim /etc/pam.d/system-auth

。。。

session required pam_limits.so <---默认就有

。。。


# vim /etc/security/limits.conf


squid hard nofile 204800 <---针对某个具体的用户限制

squid soft nofile 204800

apache soft nproc 65535

apache hard nproc 65535

apache soft nofile 65535

apache hard nofile 65535



root soft nproc 65535

root hard nproc 65535

* hard nproc 65535 <---匹配任何普通用户

* soft nproc 65535

* hard nofile 65535

* soft nofile 65535



如果是图形界面的化,需要ctrl + alt + <--- 重启图形界面才生效


如果是文本终端,就需要重新登录就生效


重启肯定可以生效




例子5:使用pam_tally 或者 pam_tally2 模块限制 sshd的登录。实现连续3次登录失败,锁定帐号5分钟



shell> vim /etc/pam.d/sshd

#%PAM-1.0

auth required pam_sepermit.so

auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=300

auth include password-auth

。。。



命令:

# pam_tally2 -u root

Login Failures Latest failure From

root 18 08/10/13 15:50:32 10.1.1.211



# pam_tally2 -u root -r 把登录失败的次数重置为0


rhel5是这个命令

# failure


例子5:

配置vsftpd服务,使用虚拟帐号登录,所有的虚拟帐号和密码都存放在mysql数据库

使用的pam模块在笔记目录Sec_01中找到pam_mysql-0.7RC1.tar.gz

想办法,看文档,找资料学会pam_mysql.so的使用

vsftpd的虚拟帐号配置,可以上网找资料,或者man vsftpd.conf来实现



virtual

guest


一、安装mysql-server , mysql开发包(头文件和库文件)


rhel5:

# yum install mysql-server mysql-devel mysql -y


rhel6:

# yum install mysql-server mysql-devel mysql-libs mysql -y


二、安装pam_mysql


# yum install pam-devel openssl-devel cyrus-sasl-devel -y


--with-pam-mods-dir=/lib64/security/ <---如果是32位系统,就可以忽略这个参数



# ./configure --with-pam-mods-dir=/lib64/security/

# make && make install

...

Libraries have been installed in:

/lib64/security/

...


三、通过查看源码包里的README文档,需要在数据库建立相应表结构和数据


# vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql


# old-passwords <---一定要把旧格式的密码取消


[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid



# service mysqld start



登录数据库之后,建立数据库建立表和相应数据

mysql> create database vsftpd default charset utf8;


mysql> use vsftpd


mysql> create table user (

-> id int unsigned not null primary key auto_increment,

-> name varchar(32) not null,

-> password varchar(64) not null

-> status boolean default true );



mysql> insert into user values (null,'vuser1',password('123'),true);

mysql> insert into user values (null,'vuser2',password('321'),true);

mysql> insert into user values (null,'vuser3',password('321'),false);


mysql> grant all on vsftpd.* to ftp@'localhost'

-> identified by '123';

mysql> grant all on vsftpd.* to ftp@'127.0.0.1'

-> identified by '123';


测试ftp帐号是否可以连接数据库



四、建立pam配置文件


shell> vim /etc/pam.d/myftpd

#%PAM-1.0

auth required pam_mysql.so user=ftp passwd=123 host=/var/lib/mysql/mysql.sock db=vsftpd table=user usercolumn=name passwdcolumn=pass

word crypt=2 where=status=true

account required pam_mysql.so user=ftp passwd=123 host=/var/lib/mysql/mysql.sock db=vsftpd table=user usercolumn=name passwdcolumn=password crypt=2 where=status=true



启动该服务仅仅是为了使用后面的某个命令去测试上面写myftpd的pam配置文件是否有效

# /etc/rc.d/init.d/saslauthd restart


# testsaslauthd -s myftpd -u vuser1 -p 123

0: OK "Success."

测试我们编写/etc/pam.d/myftpd是否有效,使用文件中的模块和信息连接数据库,验证vuser1帐号是否有效

# testsaslauthd -s myftpd -u vuser3 -p 321

0: NO "authentication failed" <---由于vuser3是被禁用的



五、开始配置vsftpd服务,让其支持虚拟帐号,并且使用我们自定义的myftpd配置文件进行帐号验证



# vim /etc/vsftpd/vsftpd.conf


anonymous_enable=YES <----默认虚拟帐号使用的是匿名帐号的权限,所以要启用支持匿名登录

....

pam_service_name=myftpd 把原来的vsftpd修改成我们自定义pam配置文件

guest_enable=YES

guest_username=apache

user_sub_token=$USER






根据参数要求,修改apache用户的家目录

# usermod -d '/var/www/$USER' apache

或者修改/etc/passwd文件

apache:x:48:48:Apache:/var/www/$USER:/sbin/nologin


要为每个虚拟帐号建立他们的独立的ftp根目录

# mkdir -p /var/www/vuser{1,2,3}

# chown apache:apache -R /var/www/vuser*


# service vsftpd restart



可以验证登录了,使用虚拟帐号。但是发现权限很低,是匿名帐号的权限



如果想实现所有的虚拟帐号的权限都比价高,可以随意在他们的目录下上传、下载文件,可以仅仅修改以下参数:

virtual_use_local_privs=YES 虚拟帐号就具有普通用户登录之后的权限,而不是匿名用户的权限

chroot_local_user=YES 锁定他们的目录


另外一种实现的修改权限的方法:适合大多数的虚拟帐号权限都很低,个别需要有特殊的权限,采用子配置文件的方法。

user_config_dir=/etc/vsftpd/user_conf/


假设想让vuser1具有独立一套权限:

# vim /etc/vsftpd/user_conf/vuser1

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

anon_upload_enable=YES

anon_world_readable_only=NO







      本文转自crazy_charles 51CTO博客,原文链接:http://blog.51cto.com/douya/1275961,如需转载请自行联系原作者


相关文章
|
安全 Linux 数据安全/隐私保护
|
8月前
|
Linux 数据安全/隐私保护
13.5.3 【Linux】PAM 模块设置语法
13.5.3 【Linux】PAM 模块设置语法
81 0
|
8月前
|
Shell Linux API
13.5 【Linux】使用者的特殊 shell 与 PAM 模块
13.5 【Linux】使用者的特殊 shell 与 PAM 模块
63 0
|
Linux
Linux使用PAM锁定多次登陆失败的用户
Linux使用PAM锁定多次登陆失败的用户
138 0