一、NFS网络文件共享服务
1、简单介绍
NFS包含3个版本:NFSv2、NFSv3、NFSv4
RHEL6是以NFSv4作为默认版本,NFSv4使用TCP协议,默认NFS占用5个端口,1个NFS端口(2049),四个动态端口,而老版本的NFS可以在TCP协议或者是UDP协议上运行。
/etc/exports:NFS服务的主配置文件,该文件的最主要目的是发布共享目录并为共享目录限制权限。
/var/lib/nfs/xtab:这个文件主要用来记录客户端与NFS服务器的连接记录。
格式:共享目录 客户端 参数
客户端 |
示例 |
使用IP地址指定单一主机 |
10.20.30.40 |
使用IP地址指定范围主机 |
172.16.0.0/16 |
使用IP地址指定范围主机 |
192.168.1.* |
使用域名指定单一主机 |
Test.ice.apple |
使用域名指定范围主机 |
*.ice.apple |
使用通配符指定所有主机 |
* |
参数 |
说明 |
ro |
设置共享权限为只读 |
rw |
设置共享权限为读写 |
root_squash |
共享目录的使用者是root时,将被映射为匿名账号(nobody) |
no_root_squash |
当使用NFS服务器共享目录的使用者是root时,将不被映射为匿名账号 |
all_squash |
将所有使用NFS服务器共享目录的使用者都映射为匿名账号 |
anonuid |
设置匿名账号的UID |
anongid |
设置匿名账号的GID |
sync |
将数据同步写入内存和硬盘。这可能导致效率降低 |
async |
先将数据保存在内存中,而不是直接保存在硬盘 |
2、安装nfs
yum install -y nfs-utils service rpcbind start service nfs start chkconfig rpcbind on chkconfig nfs on 一定要先启动rpcbind,默认端口111,然后再启动nfs,不然NFS quotas和NFS daemon都将启动失败.
3、共享目录设置
vi /etc/exports /media 192.168.0.10(rw,no_root_squash) /test 192.168.0.0/24(ro)
4、exportfs命令
exportfs -r #刷新共享配置 exportfs -v #查看当前共享配置 exportfs -auv #用于停止当前主机中NFS服务器的所有目录输出 exportfs -av #用于输出NFS服务器的所有共享目录 showmount -e #在NFS Server上执行此命令显示NFS Server上所有的共享卷
5、客户端使用
showmount -e IP #查看NFS服务器发布的共享目录 mount -t nfs IP:/media 本地挂载点 开机自动挂载设置: vi /etc/fstab NFS服务器的IP:共享目录 挂载点 nfs defaults 0 0
6、设置nfs固定端口
默认情况下安装完,nfs使用的都是动态端口,开启防火墙就麻烦了,nfs启动时,会读取/etc/sysconfig/nfs文件,所以我们要修改它,来强制使用固定端口。
vi /etc/sysconfig/nfs mount_port="4001" statd_port="4002" lockd_tcpport="4003" lockd_udpport="4004"
7、设置防火墙
iptables -P INPUT DROP iptables -A INPUT -p tcp -m multiport --dport 2049,4001,4002,4003,4004 -j ACCEPT
二、Samba文件共享
1、Samba项目是SMB/CIFS协议在Linux/Unix系统中的实现,能够实现跨平台的文件和打印机资源共享,适用于复杂的操作系统环境。Samba服务默认端口:tcp协议的139、445;udp协议的137、138。
Samba服务器的主要程序
smbd:提供对服务器中文件、打印资源的共享访问
nmbd:提供基于NetBIOS主机名称的解析,一般不使用
2、安装smaba
yum install -y samba samba-client samba-common service smb start chkconfig smb on
3、主配置文件分为三个部分:[global]全局,[home]用户家目录共享,[printers]打印共享
vi /etc/samba/smb.conf [global] workgroup #所在工作组名称 server string #服务器描述信息 log file = /var/log/samba/log.%m #“%m”变量表示客户机地址 max log size = 50 #日志文件的最大容量,单位为KB security = user #运行级别,一般使用share(匿名访问)和user(用户认证访问) [homes] ............ [printers] ............
4、配置匿名访问
[global] security = share #启用用户认证 [test] #客户端所访问的共享名 comment = test! #共享说明 path = /media #共享目录 browseable = yes #该共享目录在“网上邻居”中是否可见 guest only = yes #所有匿名访问 writable = yes #可写
5、配置用户认证访问
[global] security = user #启用用户认证 [share-name] #在windows显示的共享名 comment=共享说明 path=/共享路径 guest only = no #禁止匿名访问,等同pulic browsable=yes #该共享目录在“网上邻居”中是否可见 writable=yes #可写 directory mask = 0744 #默认创建目录权限 create mask=0766 #默认创建文件权限 保存退出!
创建samba用户: useradd user -s /sbin/nologin smbpasswd -a user -a:添加指定的Samba用户 -d:禁用指定的用户 -e:启用指定的用户 -x:删除指定的用户 不加参数可直接修改samba用户密码
6、linux客户端访问
smbclient �CL //ip #查看公开的共享目录 smbclient -U user /ip/test #登陆共享 mount -o useranme=user,password=123.com //192.168.0.203/test /mnt/ #挂载到本地使用
7、设置防火墙
iptables -P INPUT DROP iptables -A INPUT -p tcp -m multiport --dport 139,445 -j ACCEPT
三、ACL高级权限
UGO权限模型基于所属用户、组的,一个文件只能设置一个组,并对改组有权限控制,如果该文件需要有多个组有访问控制权限的话,UGO是无法满足需求的。使用ACL权限,必须先对这个文件系统添加ACL属性。
格式:setfacl -m u/g:用户/组:权限
1、mount -o remount,acl /dev/sdb1 /data #为/dev/sdb1添加ACL属性
2、mount | grep /dev/sdb1 #看到已经启用了acl
/dev/sdb1 on /data type ext4 (rw,acl)
3、/data目录现在对其他用户是没有写入权限的,现在我们给user1设置ACL
getfacl /data #查看/data目录的具体权限
可以看到文件的属主和属组都是root,user的权限是rwx,group的权限也r-x,other的权限是r-x。而且最重要的是user:user1:rwx,也就是user1这个用户对该目录也有rwx的权限。
现在su - user1,就有写入权限了。
4、对组使用ACL权限
setfacl-mg:user1:rwx/data #添加user1组对/data权限
usermod -g user1 user2 #将user2加入user1组
su - user2,现在就可以有写入权限了。
但是/data目录下的其他文件是没有写入权限的,ACL功能只对当前目录生效,不能对其子目录生效。
可以使用d参数对子目录设置ACL权限,但不对当前目录生效,只对所有子目录,以后不管任何用户对/data添加数据,user2都会继承它们的权限。
5、对当前目录所有子目录设置ACL,使user2对子目录有写入权限
setfacl -m d:u:user2:rwx /data/
现在user2可以对/data目录下子目录有写入权限了。
如果文件的属主和属组和文件的ACL权限发生冲突的时候,以属主和属组为准,其实文件的ACL功能只对other人有意义。
6、移除文件系统的ACL权限
setfacl -k /data #移除文件系统的默认ACL属性 setfacl -b /data #移除文件系统的所有ACL权限 setfacl -x u:user1 /data #移除user1对文件系统的ACL权限
7、一个项目需求:项目组需要名为/opt/research目录,用于存储他们的项目文档。只有组profs和grads中的成员能够在该目录中创建新文件,并且新文件应具有以下属性:
1.>目录应归root用户所有;
2>.新文件应归grads组所有;
3>.profs中的成员应自动拥有对新文件读写权限;
4>.组interns应自动拥有对新文件的只读权限;
5>.其他用户(不是组profs、grads、interns的成员)不能对该目录及其内容拥有任何权限。
前三行创建三个组,中间三行创建了/opt/research目录,并确保其归用户root、组grads所有,所拥有用户和组具有读、写、和执行权行权限,并且grads将拥有该目录中创建的文件的sgid权限。
最后四行则通过使用acl为组profs和interns授予对目录的适当权限,通过默认acl为组profs和interns授予对该目录中新创建文件的适当权限。
用getfacl显示最后权限:
四、SELinux安全机制
SELinux 全称 Security Enhanced Linux (安全强化 Linux)是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。
Selinux是一组可确定哪个进程能访问哪些文件、目录、端口等的安全规则。每个文件、进程、目录和端口都具有专门的安全标签,称为selinux上下文。
Selinux将进程分类,将资源分类,定义了那个进程在哪个范围内运行,只能访问哪些资源。此时不管它对其它的资源有读写权限此时只要selinux不允许 它就不能访问。
SElinux针对两种类型定义了两个基本概念:
域(domain):域用来对进程进行限制。
上下文(context):上下文用来对系统资源进行限制。
1、SELinux状态查看与配置
配置文件位置:/etc/selinux/config,做到了一个链接到/etc/sysconfig/selinux
设置完模式后,要重启系统才能生效
2、三种模式
强制(enforcing):受selinux保护,违反策略,就禁止操作。默认是这个模式
允许(permissive):不受selinux保护,只是收到警告信息,把违反内容记录下来。
禁用(disabled):禁用selinux
3、SELINUXTYPE=targeted参数
定义selinux使用哪个策略模块保护系统。
targeted:红帽开发的策略,只对dhcpd,httpd,mysqld,named等网络服务保护,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。这样的策略还有Strict、mls:strict是NAS开发的,能对整个系统进行保护,但是设定复杂。mls:是一个较新的安全策略。
4、SELinux相关命令
sestatus:查看selinux工作状态 getenforce:查看selinux是否开启 setenforce:设置selinux运行模式,1开启(Enforcing),0关闭(Permissive)
5、查看和设置selinux的boolean值
selinux策略中定义许多boolean值,用户自定义要让selinux开启保护某些程序,或者是关闭对某些程序、程序中的某个项目的保护,目录位置/selinux/boolean/下相关文件。
getsebool -a :查看boolean值 getsebool -a | grep ftp #查看ftp相关bool值 setsebool ftpd_disable_trans off #临时生效 setsebool -P ftpd_disable_trans off #设置boolean值,-P为设置永久生效
6、使用apache做个个人主页,默认是是用apache来访问运行访问apache的,而boolean值默认httpd禁止切换到其他家目录。所以就会显示没有权限访问。
vi /etc/httpd/conf/httpd.conf <IfModule mod_userdir.c> UserDir public_html #启用网络读取的用户家目录网站 </IfModule> useradd user echo “test!!!” >> /home/user/public_html #创建家目录测试页 chmod o+x /home/user/ #设置其他用户对user主目录有执行权限
http://192.168.0.202/~user #访问测试页报错
解决方法:setsebool httpd_enable_homedirs on #开启httpd对家目录访问,这时就可以访问了
7、安全上下文相关命令
查看文件安全上下文 ls -Z /etc/hosts -rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts 查看用户安全上下文 id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
查看进程安全上下文vsftpd和httpd
查看移动和复制文件安全上下文变化
chcon(change context)参数:
-t:类型
-R:递归
-u:用户
-r:角色
9、实验:让 Apache 可以访问位于非默认目录下的网站文件
新创建的index.html是可以访问的,因为继承了目录的安全上下文,属性中包含了httpd_sys_content_t标签
Alias /test "/opt/web" <Directory "/opt/web"> options none allowoverride none order allow,deny allow from all </Directory> service httpd restart
添加了一个虚拟目录,再访问http://192.168.0.202/test出现没有权限访问
解决:chcon -t httpd_sys_content_t /opt/web/index.html #再访问虚拟目录成功
10、其他
restorecon -R -v /var/www #恢复文件默认的上下文 chcon --reference=/etc/named.confg.orig /etc/named.conf #修改参照文件的上下文 /var/log/audit/audit.log #SElinux报错信息
五、RHEL6安装软件和YUM管理软件
rpm包命名格式:
1、RPM命令
查询已安装的RPM软件信息
格式:rpm -q[子选项] [软件名]
-qa:查看系统中已安装的所有RPM软件包列表
-qi:查看指定软件的详细信息
-ql:查询指定软件包所安装的目录、文件列表
-qc:仅显示指定软件包安装的配置文件
-qd:仅显示指定软件包安装的文档文件
-qf:查询文件/目录属于哪个RPM软件
查询未安装的RPM包文件
格式:rpm -qp[子选项] RPM包文件
-qpi:通过.rpm包文件查看该软件的详细信息
-qpl:查看.rpm安装包内所包含的目录、文件列表
-qpc:查看.rpm安装包内包含的配置文件列表
-qpd:查看.rpm安装包内包含的文档文件列表
安装或升级RPM软件包
格式:rpm [选项] RPM包文件...
-i:安装一个新的rpm软件
-e:卸载指定的rpm软件
-U:升级某个rpm软件,若原本未装,则进行安装
-F:更新某个rpm软件,若原本未装,则放弃安装
--force:强制安装所指定的rpm软件包
--nodeps:安装、升级或卸载软件时,忽略依赖关系
-h:以“#”号显示安装的进度
-v:显示安装过程中的详细信息
2、YUM源使用
当我们安装一个软件的时候,需要下载好多依赖的包,这时就很麻烦,使用yum源就可以自己去查找依赖包来安装,提高工作效率。yum源可以是本地的,也可以是ftp或http协议来发布的。
在RHEL6系统的安装光盘中,已针对软件目录Packages/建好了repodata数据,因此只要简单地将整个光盘中的内容或将光盘全部内容复制到硬盘通过HTTP或FTP进行发布,就可以作为软件仓库了。
3、YUM命令格式:yum <options> <command> <package...>
options:
-y : 就这个比较常用,这个参数是在安装软件使用,有需要输入yes的自动回答
command:
list : 列出在yum server 上面有的RPM套件;若执行yum list installed则表示只列出系统中已安装的软件包,yum list available则表示只列出软件仓库中可用(尚未安装)的软件包,yum list update则表示列出可以升级版本的软件包。
install: 安装某个套件
update : 升级某个套件,如果update后面没有接套件名称,即更新目前主机所有已安装的套件.
info : 列出某个套件的详细信息,相当于rpm -qi package内容
clean : 将已下载到本机的packages或headers移除
remove : 移除已经安装在系统中的某个套件
yum localinstall package:本地安装软件包
yum update:全部更新
yum update package :更新指定程序包package
yum check-update :检查可更新的程序
yum info <package> :显示安装包信息
yum search packages:查找软件包
yum removepackage:删除程序包
yum clean packages:清除下载的rpm包
yum clean all:清除header与rpm包
yum grouplist:列出所有组
yum groupinstall:安装某个软件组
4、创建FTP源
vi /etc/yum.repos.d/server.repo #后缀必须是repo结尾 [rhel6] #软件仓库的名字 name=rhel6 #软件仓库的描述 baseurl=ftp://192.168.0.202/pub/ #软件仓库的位置 enabled=1 #是否起用软件仓库 gpgcheck=1 #是否检查GPG签名(用来验证要安装的包是不是REDHAT官方的) gpgkey=file://etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release #GPG签名密钥的位置
如果安装软件包出现:public key for …….rpm is not install
解决方法:导入完整性验证的公钥
mount /dev/sr0 /mnt
rpm --import /mnt/RPM-GPG-KEY-redhat-release
5、创建自己搜集软件包源
必须包括存在依赖关系的所有安装文件,还需要手动创建repodata数据文件,使用createrepo工具,
createrepoa主要用于收集目录中的rpm包文件的头信息,以创建repodata软件仓库数据。
yum install createrepo cp -a /mnt/Packages/* /var/ftp/pub/Packages/ #我们以rhel软件包为例,复制到ftp目录下 cd /var/ftp/pub/ createrepo --database ./ #创建软件仓库信息文件 ls repodata #可以看到已经创建好了相应的软件仓库信息文件 filelists.sqlite.bz2 other.sqlite.bz2 primary.sqlite.bz2 repomd.xml filelists.xml.gz other.xml.gz primary.xml.gz yum list #查看yum源软件包