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
root@hdp0:~# ldd `which login` | grep libpam
libpam.so.0 => /lib/libpam.so.0 (0xb76e2000)
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中定义限制的具体用户和时间
vim /etc/security/time.conf
login;tty3;fenix;Th2100-2300 //作用程序是login,作用在tty3上,fenix允许在周四2100-2300间登录
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