安全的动态磁盘策略
linux内核可以模拟RAID控制器,用来管理硬盘,但只支持级别0,1,4,5
RAID0 又称striping
把连续的数据访问分散到多个磁盘上来提高存储性能,速度最快,但最危险。
RAID1 又称Mirror或Mirroring
最大限度的保证用户数据的可用性和可修复性,用户数据100%自动复制到另外一个硬盘上,速度稍慢,因为要同时写多个硬盘。
RAID5 最少需三个硬盘
不对存储的数据时行备份,而把数据和对应的奇偶校验信息分别存储在不同的磁盘上,当一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
RAID0+1 也称RAID10
结合RAID0和RAID1的优点,很多公司在应用
Linux中的软件RAID
1.默认内核已支持软件RAID控制器
2.需用到raidtools工具来创建管理RAID设备,但Fedora Core5不使用这个,而用mdadm工具。
3.软件RAID设备文件名:/dev/mdN (N=0,1,2…)
4.软件RAID设备可以当分区看待,需格式化后挂载
#mkfs.ext3 /dev/md1
#mount /dev/md1 /opt
使用mdadm来创建和管理RAID
RAID0
添加硬盘
RAID设备的成员是硬盘分区,需先对硬盘分区,分区不能在同一物理硬盘上
#fdisk /dev/sdb
n创建主分区,t分区类型fd,w写保存
#fdisk /dev/sdc
#mdadm –Cv /dev/md0 –l0 –n2 /dev/sdb1 /dev/sdc1
-C,--create 创建一个新的阵列
-v,verbose 显示细节
/dev/md0 阵列设备的名称
-l,--level= 阵列级别,如0,1,4,5,6
-n,--raid-devices= 阵列活动数目
/dev/sd[bc]1 阵列包含的设备列表
#more /proc/mdstat 查看阵列状态
#mkfs.ext3 /dev/md0 创建文件系统
#mount /dev/md0 /mnt/raid
让系统自动挂载,修改/etc/fstab,添加
/dev/md0 /mnt/raid ext3 defaults 0 0
RAID5 故障模拟
前面已创建了一个RAID5设备md0
#mdadm –Cv /dev/md0 –l5 –n3 –x1 –c128 /dev/sd[b,c,d,e]1
1.将/dev/sdb1标记为已损坏的设备
#mdadm /dev/md0 –f /dev/sdb1
这时阵列开始重构和恢复数据
2.移除损坏的设备
#mdadm /dev/md0 –r /dev/sdb1
3.将新设备添加到阵列
注意,一:对硬盘正确分区,二:添加设备名要与被移除的一致,如sdb1
#mdadm /dev/md0 –a /dev/sdb1
生成配置文件/etc/mdadm.conf
格式如下:
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 ARRAY /dev/md10 level=raid10 num-devices=4 UUID=12334343dkfj
其中UUID信息通过#mdadm –D /dev/md10得到
#mdadm –Ds 扫描该文件信息
常用阵列维护命令
1.启用阵列
#mdadm –As /dev/md0
-A 启用已存在的阵列
-s 以/etc/mdadm.conf为依据
没有创建mdadm.conf文件,则采用如下方法启用
#mdadm –A /dev/md0 /dev/sd[bc]1
2.停止阵列
#mdadm –S /dev/md0
3.显示阵列详细信息
#mdadm –D /dev/md0
(十二)
LVM逻辑卷管理器
PV (physical volume)物理卷
VG (Volume Group)卷组
LV (Logical Volume)逻辑卷
1.fdisk /dev/sdb
分区sdb1,sdb2,sdb3
分区类型8e(Linux LVM)
如果系统在使用sdb,需要重启,以便系统重新读取sdb的分区表信息
2.#pvcreate /dev/sdb[1-3] 初始化物理卷
3.#vgscan 扫描物理卷,创建卷组数据库
4.#vgcreate vg0 /dev/sdb1 /dev/sdb2 用sdb1,sdb2创建卷组vg0
#vgdisplay vg0 查看卷组vg0的信息
5.#lvcreate –n data –L 10M vg0 从vg0中创建一个新的名为data,大小10M的逻辑卷
6.#mkfs.ext3 /dev/vg0/data 格式化
7.#mount /dev/vg0/data /mnt
#lvdisplay /dev/vg0/data 查看逻辑卷data的分区情况
#lvcreate –n test –l 5 vg0 创建逻辑卷用-l指定块数,默认块大小4MB,即分配逻辑卷20MB大小
创建完逻辑卷一定要mkfs.ext3格式化才能使用
#lvscan 扫描逻辑卷,看它们的活动情况
#lvextend –L +20M /dev/vg0/data 扩大逻辑卷20M,要先umount分区,再扩大
#e2fsck –f /dev/vg0/data 强行检查data逻辑卷
#resize2fs /dev/vg0/data 重新定义分区大小
以上三步要按顺序进行
#pvscan 查看系统目前的物理卷情况
#vgextend vg0 /dev/sdb2 扩大卷组vg0,将分区sdb3加入卷组
#pvmove /dev/sdb1 移除物理卷
#vgreduce vg0 /dev/sdb1 从卷组中删除sdb1
pvmove将数据移走,但sdb1还在vg0内,还是属于卷组分区,vgreduce将sdb1从vg0中删除
创建卷组时,默认的PE大小4MB,允许的LV最大256G
#vgcreate –s 8M vg1 /dev/sdb1
-s 指定PE块大小
通过改变PE块大小,从而改变卷组允许支持的逻辑卷最大容量
技巧:
#clear 清屏
#df –lh 显示系统现在的分区挂载情况
建立快照(备份数据)
#lvcreate –s –L 52M –n snap /dev/vg0/data
-s 表示快照
-L 快照大小要大于或等于被创建的逻辑卷data
-n 快照名称
快照不用格式化即可使用
删除逻辑卷步骤LVàVGàPV
1.umount所有LV
2.lvremove /dev/vg0/data (通过lvscan查看)如有快照,先移除快照再移除逻辑卷。
3.#vgremove vg0
使用过程中,如有错误,可查看系统日志
#tail /var/log/message
(十三)
综合应用案例
要求:使用三个硬盘存储数据,保证数据安全性的同时还能让磁盘窨根据需要动态的缩放
设备sdb sdc sdd
1.将三个硬盘组成RAID5,实现安全性
2.在阵列md0上创建物理卷,卷组,逻辑卷
3.将数据转移到逻辑卷
具体操作:
1.fdisk 三个硬盘,分区类型fd,最后得到sdb1,sdc1,sdd1
2.创建raid设备
#mdadm –Cv /dev/md0 –l5 –n3 /dev/sd[b,c,d]1
3.#pvcreate /dev/md0 在阵列上初始化物理卷
4.#vgcreate vg /dev/md0
5.#lvcreate –n home –L 100M vg
#lvcreate –n var –L 100M vg
#mkfs.ext3 /dev/vg/home
#mkfs.ext3 /dev/vg/var
#mkdir /mnt/home
#mkdir /mnt/var
#mount /dev/vg/home /mnt/home
#mount /dev/vg/var /mnt/var
#cp –a /home/* /mnt/home
#cp –a /var/* /mnt/var
#df –lh
6.#vi /etc/fstab 添加
/dev/vg/home /home ext3 defaults 0 0
/dev/vg/var /var ext3 defaults 0 0
7.#vi /etc/mdadm.conf 创建文件,以便系统启动时能够自动识别raid设备,内容如下:
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 ARRAY /dev/md0 level=raid5 num-devices=3 UUID=123545:erdfj3:dkf3jd
(UUID具体通过mdadm –D /dev/md0获取)
8.reboot
上面已正确地将数据移植到LVM上,下面将/分区移植到LVM上
#lvcreate –n root –L 200M vg
#mkfs.ext3 /dev/vg/root
#mount /dev/vg/root /mnt
#cd /mnt
#mkdir proc tmp var home opt cdrom media mnt srv selinux
#cd /
#cp –a bin dev etc lib sbin root usr sys /mnt &
当操作的过程时间太长,可按ctrl+z,再输入bg,让它后台运行
技巧:
#rm –rf /mnt/bin 强行删除目录
#\ls 不高亮显示
RAID5的磁盘容量利用率为2/3
利用mkinitrd创建一个虚拟的磁盘映像文件
#mkdir /boot/test
#mkinitrd –v –preload raid5 –preload lvm-m0d /boot/test/initrd-lvm-$(uname-r)img $(uname –r)
在里面添加加载根分区所需的raid设备文件,驱动程序,命令mdadm等
#cd /boot/test
#mv initrd-lvm-2.6.15-1.2054_FC.img initrd-lvm-2.6.15-1.2054_FC.img.gz
#gunzip init-lvm-2.6.15-1.2054_FC.img.gz
#cpio –idv < init-lvm-2.6.15-1.2054_FC.img
#rm initrd-lvm-2.6.15-1.2054_FC.img
添加设备文件,复制文件时要注意-a参数
#cp –a /dev/vg dev
#cp –a /dev/mapper dev
#cp –a /dev/md0 dev
#cp –a /dev/sd[abcd] dev
#cp –a /dev/sd[abcd]1 dev
#vi init 添加,一定要在mkblkders后面添加,系统启动后执行的第一个脚本,自动激活磁盘阵列
mdadm –As
vgscan
vgchange –a y
修改加载的root分区
mount –o defaults --ro -t ext3 /dev/vg/root /sysroot
#cp /sbin/vgscan bin
#cp /sbin/vgchange bin
#cp /sbin/mdadm bin
#ldd bin/mdadm 查看该命令所需的库文件
#cp /lib/libc.so.6 lib (字母o)添加命令所需库文件
#cp /lib/ld-linux.so.1 lib
上面的mdadm -As会根据配置文件mdadm.conf激活阵列,所以将/etc/mdadm.conf拷过来
#cp /etc/mdadm.conf etc (之前已经手工创建了mdadm.conf),添加配置文件
最后确认/boot/test目录里的文件准备打包
#cd /boot/test
#find -print | cpio -oc > /boot/initrd-lvm-$(uname -r).img
#cd /boot
#gzip initrd-lvm-2.6.15-1.2054_FC.img -c > init-lvm-2.6.15-1.2054_FC.img.gz
这样将文件恢复成一个虚拟磁盘映像文件
修改引导配置
#vi /boot/grub/grub.conf
修改defaults=1
添加
title Fedora LVM
root (hd0,0)
kernel /boot/vmlinuxz-2.6.15-1.2054_FC ro root=/dev/vg/root
和/boot目录里的vmlinuxz对应,注意root=/dev/vg/root的修改
initrd /boot/initrd-lvm-2.6.15-1.2054_FC.img.gz
保存退出
#mount /dev/vg/root /mnt
#cd /mnt
#vi etc/fstab 修改
/dev/vg/root / ext3 defaults 1 1
这样系统启动就会将/dev/vg/root 作为主分区使用
完成所有修改
#reboot
从启后ls /boot应该没有东西,因为物理boot在sda1分区里
可以#mount /dev/sda1 /mnt 再看看里面的boot内容
证明已经成功的转移了根分区,完成了案例提出的要求。
在进行这个实验时,主要是对磁盘映像文件的修改,修改init文件时,要注意加载模块的顺序,先创建块设备,才能使用块文件。
使用mkinitrd创建文件后,要注意用file命令查看文件类型,从而进一步对映像文件进行解压,提取等操作。当修改完磁盘映像文件initrd后,要知道如何打包、压缩。注意如何使用cpio命令。
(十四)
Linux下使用U盘
#ls /dev 确认设备已识别
#mount -o iocharset=gb2312 /dev/sda1
more后ctrl+F向下翻页(或空格)ctrl+b(上滚)
ls -a 显示隐藏文件(以.开头的文件)
文件权限rws s表示执行这个程序的使用者,临时拥有和所有者一样的权力身份来执行该程序
cp -r 源 目的 -r参数表示连子目录一起拷贝
rm -i 确认删除
-r 删除子目录
-f 强制删除
du 磁盘或目录使用了多少空间
df 磁盘或目录剩余可用空间
cat >file1 等价你输入文字,输完后ctrl+C或ctrl+D结束
>>符号表示在文件尾附加,>符号表示创建新文件
less 可上下滚动文件内容
which 在$PATH设置的目录查找文件
FTP服务器
FTP使用TCP协议
21端口传输控制信息
20端口传输数据
验证信息采用明文传输
匿名用户anonymous
binary模式传输程序、图片等二进制文件
ascii模式舆文本文件
安装vsftpd
1.下载源代码vsftpd-2.0.5.tar.gz
2.编译源程序,可参考帮助文件INSTALL
#tar zxvf vsftpd-2.0.5.tar.gz
#cd vsftpd-2.0.5
#make
#make install
3.安装配置文件
#cp vsftpd.conf /etc
#cp RedHat/vsftpd.pam /etc/pam.d/ftp
4.编缉配置文件/etc/vsftpd.conf
5.启动服务器
#/usr/local/sbin/vsftpd &
配置文件
listen=YES 服务器独立运行
服务器默认配置文件,不允许其他用户登录,只能匿名登录,匿名登录需要先建/var/ftp目录
finger 用户信息查看工具
finger ftp 确认是否有ftp这个用户
为匿名用户可登录,要创建ftp用户和/var/ftp目录
#mkdir /var/ftp
#chown root.root /var/ftp
#chmod og-w /var/ftp
为使vsftpd开机自动进行,在/etc/rc.local添加/usr/local/sbin/vsftpd &
#netstat -tnl 查看本地已启动的服务
vsftpd可以以两种方式运行
让vsftpd独立运行,关闭xinetd的方式
#chkconfig vsftpd off
vsftpd的配置文件
anonymous_enabled=YES #允许匿名登录
local_enable=YES #允许本地用户登录
write_enable=YES #允许客户端写
local_umask=022 #本地用户新建文件的umask值
anon_upload_enable=YES #允许匿名用户上传文件
anon_mkdir_write_enable=YES #允许匿名用户创建目录
dirmessage_enable=YES #允许使用目录的消息
ftpd_banner=Welcome to redhat #登录欢迎词
ls_recure_enable=YES #允许客户端使用ls -R命令
listen=YES #监听模式
修改配置文件后,重新启动vsftpd服务
#killall -9 vsftpd 强行终止
#/usr/local/sbin/vsftpd & 启动
#id redhat 查看redhat用户信息(组id,所属组)
#mkdir /var/ftp/incoming #为匿名用户开放上传incoming目录
#chgrp ftp incoming
#chmod g+w incoming
chroot环境 (用户不能改变主目录,不能查看主目录外的其他目录,可以隐藏主目录的位置)
/etc/vsftpd.conf:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
/etc/vsftpd.chroot_list: (锁定主目录的用户列表)
redhat
chiaitlab
#killall -HUP vsftpd
(十五)
用户控制
#vi /etc/vsftpd.conf添加
userlist_enable=YES 启用用户列表
userlist_file=/etc/ftpusers 定义用户列表文件位置
userlist_deny =YES 拒绝列表的用户
=NO 只允许列表的用户登录
#vi /etc/ftpusers
编缉用户列表,将要进行控制的用户添加进去,一行一个用户
#ldd vsftpd 显示依赖的共享库
默认编译安装没有支持PAM模块,通过ldd /usr/sbin/vsftpd看是否在依赖于libpam.so.0,如果有证明服务支持PAM。
通过光盘RPM安装(第二张)
#rpm -ivh vsftpd-2.0.4-1.2.i386.rpm
配置文件及用户列表在/etc/vsftpd目录下
pam服务名 /etc/pam.d/vsftpd
vsftpd在/usr/sbin/vsftpd
ftp默认拒绝id 500以下的用户登录
虚拟账号
对于用DB库存储用户及密码,先看系统是否有相应软件包
#rpm -qa | grep db4
db4-devel 第三张盘
db4 第一张盘
db4-utils 第4张盘
1.建虚拟账号users.txt
tom
123
jack
123
用户密码各占一行
#db_load -T -t hash -f users.txt /etc/vsftpd/vsftpd_login.db
#chmod 600 /etc/vsftpd/vsftpd_login.db
2.修改/etc/pam.d/vsftpd 增加(将其他注释掉)
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
3.建虚拟账号目录
#useradd vuser
!!注意,编译安装vsftpd时,首先检查是否安装了pam-devel(FC5在第4张盘),否则编译选项定义了pam,但依然无法使用pam服务,最好用ldd确定一下
4.编缉/etc/vsftpd/vsftpd.conf
anonymous_enable = NO
local_enable =YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
guest_enable=YES
guest_username=vuser
(十六)
Proftpd
#tar jxvf proftpd-1.2.9.tar.gz2
#cd proftpd-1.2.9
#./configure 生成与系统有关的配置文件
#make 编译把源程序编译成二进制文件
#make install
#/usr/local/sbin/proftpd
配置文件:/etc/local/etc/proftpd.conf
vi使用技巧:
yy 复制当前行
p 粘贴
/ 查找
n 查找下一个
查找与查找下一个配合使用
shift+D 在当前行删除光标后的所有字符
#netstat -tnlp 显示进程及ID
为Grub设置密码,防止用户修改或编缉Grub的引导菜单
#grub-md5-crypt 产生一个md5加密的字符串
#grub-md5-crypt >> /etc/grub.conf
#vi /etc/grub.conf
password --md5 $1#123abckdfj343k
这样在启动时,要编缉引导菜单必须输入密码,在引导菜单最后加上 s ,可进入单用户模式。
find / -perm -002 查找文件权限中其他人具有写权限的文件,0表示用户,组不管
find / -perm +6000 查找文件,不管用户,组其他,只要权限中含有6(读写)即满足要求。
- 表示权限位必须具有的
+ 表示权限位可能有或无
(十七)
Linux-PAM认证模块
Pluggable Authentication Modules for Linux 可插拨认证模块
当用户访问服务器,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目录下选择一个对应的服务文件,最后根据服务文件的内容选择具体的PAM模块进行处理。
通过ldd查看服务程序在编译时是否使用了libpam.so,决定服务程序是否支持PAM认证。
具体的pam文件放在/lib/security目录下,服务文件放在/etc/pam.d目录下
PAM服务文件格式
eg:
auth required pam_security.so
auth required pam_stack.so service=system-auth
service表示调用子服务文件
Module-type:
auth 检查用户和密码,分配权限
account 检查账号是否过期,是否有权登录
session 从用户登录成功到退出的会话控制
password 控制用户改密码的过程
control-flag:
required 要求矣须通过,否则结束退出
requisite 如果不通过还可继续向下认证,后面有一通过即可。
sufficient 通过则不需要向下认证
optional 可选项
常用PAM服务文件
login -------/etc/pam.d/login
ipop3d -------/etc/pam.d/pop
vsftpd -------/etc/pam.d/ftp(编译安装)或/etc/pam.d/vsftpd(rpm安装)
sshd -------/etc/pam.d/sshd
su -------/etc/pam.d/su
imap -------/etc/pam.d/imap
/lib/security目录下,各个pam模块的作用,可参考/usr/share/doc/pam-0.99.3.0下的帮助文件。
相同类型Module-type组成一个堆栈。
常用PAM模块
pam_access.so 控制访问者地址与账号名称
pam_listfile.so 控制访问者的账号名称或登录位置
pam_limits.so 控制为用户分配的资源
pam_rootok.so 对管理员(uid=0)无条件允许通过
pam_userdb.so 设定独立用户账号数据库认证
tty 终端设备
(十八)
pam_access.so模块的使用
―――控制访问sshd服务的主机和用户
1.修改需使用这个模块的服务文件,如sshd: /etc/pam.d/sshd添加
account required pam_access.so
2.修改模块的配置文件
/etc/security/access.conf
- : redhat : ALL EXCEPT 192.168.0. (格式)
3.测试
ssh
ssh
pam_access.so根据主机、IP、用户、拒绝或允许访问。
pam_listfile.so的应用 (比pam_access.so更加详细控制)
1.首先查看它的帮助文件,看它的具体格式,参数如何
#less /usr/share/doc/pam-0.99.3.0/txts/README.pam_listfile
item user,tty,group 说明列表文件中的内容
sense allow,deny 拒绝或允许文件中的用户
file 指定一个文件,内容根据item项来添加
onerr succeed,fail 当模块本身产生错误时,返回的值,如无法打开file指定的文件,一般设为succeed
2.将模块应用到sshd服务
将上面添加的pam_access.so清掉,然后在/etc/pam.d/sshd中添加(第一行)
auth required pam_listfile.so item=user sense=deny file=/etc/denyuser onerr=succeed
注意添加的位置顺序,否则看不到效果
3.创建编缉列表文件
#echo “redhat” >/etc/denyuser
4.测试
#ssh -l redhat 192.168.0.22 失败
#ssh -l chinaitlab 192.168.0.22 成功
#w 显示已登录的用户及最近的一次操作
(十九)
pam_limits.so的应用
1.查看帮助文件,确认它的配置文件位置,参数模式
#less /usr/share/doc/pam-0.99.3.0/txt/README.pam_limits
-
用户名或组名
soft软限制
hard硬限制(不能达到的)
- 限制的内容,fsize文件大小,nproc最大进程数,maxlogins用户登录次数
2.将模块应用到sshd服务,修改服务文件
#vi /etc/pam.d/sshd 添加
session required pam_limits.so
session 控制用户进程的登录次数,文件大小,通过控制用户的会话进程来限制用户使用的资源
3.编缉pam_limits.so的配置文件
redhat hard maxlogins 2
(限制redhat登录到sshd服务的次数。
4.测试
#ssh -l redhat 192.168.0.22 第1个
#ssh -l redhat 192.168.0.22 第2个
表示同时最多可以有两个redhat用户登录
pam_rootok.so的应用
#chfn 改变用户的finger信息
普通用户使用这个命令修改信息时,需要输入密码才能使用,而root用户则不需要。
分析:
#more /etc/pam.d/chfn
第一行为auth sufficient pam_rootok.so
因为chfn的pam服务文件的第一行应用了pam_rootok.so模块,所以当root用户使用chfn时不需验证,不需要再往下,直接通过。
pam_userdb.so模块需要一个db数据库储存用户信息,具体如何使用可参考前面的vsftpd虚拟用户。
在使用PAM模块时,注意参考README.pam帮助。