Redhat Linux初体验(3)

这三周都被拐卖到成都培训RHCE,讲真,还是当学生好啊哈哈哈把学习笔记搬上来,关键时刻能做个速查~

献上第三周的笔记。

2018-07-30

防火墙

  1. 通常使用Firewall Configuration图形界面进行配置更方便;
  1. Ports、Sources等普通规则(单规则)添加时应注意,这些规则的生效是取并集;Rich Rules(富语言规则)用来配置复杂规则,常用语配置交集过滤;
  1. iptables等旧命令使用直接语言规则,在Redhat 7中已经不提倡使用,具体参考man 1 firewall-cmdman 5 firewalld.direct
  1. Redhat 7推荐使用富语言规则,参考man 5 firewalld.richlanguage
    • 查看服务firewall-cmd --get-services
    • 查看区域已经添加或生效的策略firewall-cmd --list-all
    • 查看富语言规则firewall-cmd --list-rich-rules
  1. 实验:仅允许desktop4访问server4的web服务,要求日志具有前缀NEW HTTP ,日志限速每秒3条:
    • 安装httpd服务:yum -y install httpd
    • 添加内容:echo '<h1>hello world</h1>' > index.html
    • 启动服务:systemctl start httpd.service && systemctl enable httpd.service;查看服务netstat -tnlp
    • 图形化界面添加:Family: ipv4Element: service: httpActionSource: 172.25.4.10/32Log: Prifix: NEW HTTP; With limit: 3/second
    • 查看日志在系统挑日志:tail /var/log/message
    • 查看已生效策略:firewall-cmd --list-all
    • 使用命令行重新实验,重载配置:firewall-cmd --reload
    • 参考man 5 firewalld.direct
      1
      2
      3
      4
      # 运行时生效
      firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.25.4.10/32" service name="http" log prefix="NEW HTTP" limit value="3/s" accept'
      # 永久生效
      firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.25.4.10/32" service name="http" log prefix="NEW HTTP" limit value="3/s" accept' --permanent
  1. 伪装功能Masquerading用来改“发件人”信息(通常用于保护内部网络结构),端口转发Port Forwarding用来改“收件人”信息;
    • 伪装,发送包时,内网使用10.0.0.1-3...,伪装为1.2.3.4:10001-3转发去外网;接受包时将1.2.3.4:10001-3转换为内网IP10.0.0.1-3;(NAT转换)
    • 富语言规则可以指定网段进行伪装,但规则伪装只能对所有包进行伪装,无法指定网段;
    • 端口转发,服务器使用私有IP,外部请求为1.2.3.4:80,防火墙转发为10.0.0.1:8080,通常用于保护内网服务安全;
    • 伪装不需要配置伪装前后的规则,防火墙自动转换;而端口转发需要配置转发前后的规则;
  1. 实验:服务器server4(172.25.4.11)是一个在防火墙desktop4(172.25.4.10)后面的运行web服务(8080/TCP)的服务器,配置过程如下:
    • 重置虚拟机:rht-vmctl reset all
    • server4安装httpd:yum install -y httpd;配置vim /etc/httpd/conf/httpd.conf监听8080
    • 启动服务:systemctl start httpd.service && systemctl enable httpd.service;查看服务netstat -tnlp8080启动;
    • 为server4添加允许来自desktop4的流量:
      1
      firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.25.4.10/32" port port="8080" portocol="tcp" accept'

    • 为desktop4添加端口转发并开启伪装:
      1
      2
      3
      4
      # 开启伪装
      firewall-cmd --add-masquerade
      # 开启端口转发
      firewall-cmd --add-rich-rule 'rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080" to-addr="172.25.0.11"'
    • 从物理机访问防火墙desktop4的80端口,会转发至server4的8080端口;
    • 注意:从desktop4直接访问desktop4的80端口是不可以的,牵扯到用户态到内核态的数据转换,只能通过外部(如物理机)访问desktop4进行测试,详情Google “iptables四表五链”;

SELinux端口控制

  1. SELinux检查进程和端口的标签间的权限:
    • 查看进程标签:ps Z 1757,即SELinux标签的源;
    • 查看80端口的标签:semanage port -l | egrep"\b80\b",即SELinux标签的目的;
    • 查看规则:sesearch -A -s httpd_t -t http_port_t
  1. 配置SELinux端口权限:
    • 修改端口为8800:vim /etc/httpd/conf/httpd.conf
    • 重启systemctl restart httpd报错,具体情况查看systemctl status -l httpd
    • 为8800新增http访问的标签:semanage port -a -t http_port_t -p tcp 8800
    • 删除原来的标签:semanage port -d -p tcp 8080
    • 修改原来的标签:semanage port -m -t ftp_port_t -p tcp 8800
    • 注意:SELinux的默认标签是无法删除的,而对默认标签的修改也仅是新增一条相应的标签策略;

DNS管理

  1. 静态授权DNS位于/etc/hosts
  1. DNS缓存
  1. DNS服务器位于/etc/resolv.conf
  1. 解析过程为:先找DNS静态授权数据,再找本地缓存,最后远程DNS缓存服务器(查找条件转发器forward,最后查找rootDNS服务器);
  1. 查找DNS:
    • 显示简要信息:nslookup www.example.com
    • 显示详细的查询过程过程(IPv4):host -vt A desktop4.example.com
    • 显示详细的查询过程过程(IPv6):host -vt AAAA desktop4.example.com
    • 主DNS服务器可以修改数据;辅助DNS服务器不能直接修改,只能同步主DNS服务器,主/辅DNS是授权DNS,有负责的区域,即与跟域呈树形结构;缓存服务器缓存的是任意值,即二维表型结构;
    • 别名是由主机名指向主机名的记录,A、AAAA与别名都是存在正向DNS记录中;
  1. 搭建缓存名称服务:
    • 安装unbound:yum install -y unbound
    • 修改配置文件:vim /etc/unbound/
      1
      2
      3
      4
      5
      6
      interface: 172.25.4.11
      access-control: 172.25.4.0/24 allow
      domian-insecure: "example.com"
      forward-zone:
      name: "example.com"
      forward-addr: 172.25.254.254
    • 启动服务:systemctl start unbound;查看服务启动情况:netstat -tnlp
    • 允许防火墙通过:firewall-cmd --add-service=dns
    • 检查配置文件语法错误:unbound-checkconf
    • 从desktop4上测试dig @server4.example.com A server6.example.com
    • 导出配置:unbound-control dump_cache > dump.out
    • 导入配置:unbound-control load_cache < dump.out
    • 清除缓存:unbound-control flush server4.example.com
    • 清楚域信息:unbound-control flush_zone example.com

邮件服务

  1. 邮件是所有Linux自带的服务,因为crond等服务都是依赖邮件服务的;
  1. 发送邮件:mail -s 'hello student'
  1. 空客户端:禁用本地邮件投递能力,将邮箱投递全部转发到指定服务器中;
  1. 配置postfix邮件服务器:/etc/postfix/mail.cf,可以使用postconf工具,也可以直接编辑;
    • 在desktop4上:重置服务器,lab smtp-nullclient setup
    • 修改邮件服务器配置:vim /etc/postfix/main.cf
      1
      2
      3
      4
      5
      6
      7
      myorigin        = desktop4.example.com
      inet_interfaces = loopback-only
      # [空]
      mydestination =
      mynetworks = 127.0.0.0/8 [::1]/128
      relayhost = smtp4.example.com
      local_transport = error:"local delivery disabled"
    • 日志排错在/var/log/maillog,如果遇到服务报错或邮件未收到,可以使用日志排错;
    • 在server4上发送邮件测试:
      1
      2
      3
      4
      5
      mail -s 'remote student' student@desktop4.example.com
      # 正文
      hello remote
      # ^D提交
      EOT

2018-7-31

存储

  1. DAS(direct attach storage)
  1. NAS(network attach storage):
    • unix-like nfs;
    • Windows smb(cifs)
  1. SAN(storage area network): SCSI
  1. 概念:
    • node: iSCSI initiator或iSCSI target都是node;
    • IQN(iSCSI Qualified Name):全球唯一,类似链路层的MAC地址,以及网络层的IP地址;
    • target:一个带有IQN地址的提供存储资源的设备;
    • initiator:一个带有IQN地址的获取存储资源的设备;
    • portal:入口,由IP地址和端口组成,用于建立连接;
    • TPG(Target Portal Group):一组入口,用于指定iSCSI目标监听;
    • ACL(Access Control List):用于限制initiator访问的IQN资源;
    • discovery:基于入口或入口组的资源发现;
    • login:initiator验证登录;
  1. 实验:
    • desktop4上安装initiatoryum install -y iscsi-initiator-utils.i686
    • server4上安装targetyum install -y targetcli.noarch
  1. 在server4上:
    • 查看硬盘:lsblk,划分分区:fdisk /dev/vdb
    • 创建pv:pvcreate /dev/vdb1
    • 创建vg:vgcreate ISCSI_vg /dev/vdb1
    • 创建lv:lvcreate -l 511 -n disk1_lv ISCSI_vg,把disk1_lv当做存储做实验;
    • 进入targetcli交互模式:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 创建block1:
      /backstores/block create block1 /dev/ISCSI_vg/disk1_lv
      # 创建IQN:
      /iscsi create iqn.2018-07.com.example:server4
      # 创建ACL指定desktop4:
      /iscsi/iqn.2018-07.com.example:server4/tpg1/acls create iqn.2018-07.com.example:desktop4
      # 切换到/iscsi/iqn.2018-07.com.example:server4/tpg1>方便一些,创建LUN
      luns/ create /backstores/block/block1
      # 创建监听端口,使用默认端口3260:
      portals/ create 172.25.4.11
      # 查看所有配置
      ls
      # 退出自动保存(格式为json,在/etc/target/saveconfig.json)
      exit
    • 添加防火墙策略:firewall-cmd --add-port=3260/tcp
  1. 在desktop4上:
    • 修改IQN:vim /etc/iscsi/initiatorname.iscsi中的IQN为server4 ACL允许的名称iqn.2018-07.com.example:desktop4
    • 发现target:iscsiadm --mode discoverydb --type sendtargets --portal 172.25.4.11:3260 --discover,发现后系统自动将目标记录在/var/lib/iscsi/nodes/中;
    • 登录:iscsiadm --mode node -targetname iqn.2018-07.com.example:server4 --portal 172.25.4.11:3260 --login
    • 查看设备:lsblk
    • 登出:iscsiadm --mode node -targetname iqn.2018-07.com.example:server4 --portal 172.25.4.11:3260 --logout
    • 详情参考man 8 iscsiadm

nfs共享

  1. 在server4上:
    • 查看包是否按照rpm -q nfs-util;创建/nfsshare目录;
    • 配置共享vim /etc/exports/nfsshare desktop4.example.com(rw)
    • 启用服务systemctl status nfs-server && systemctl enable nfs-server && systemctl start nfs-server
    • 修改共享配置后重载exportfs -r
    • 添加nfs防火墙策略firewall-cmd --add-service=nfs --permanent && firewall-cmd --add-service=nfs
    • 添加rpc-bind防火墙策略(远端查看showmount需要)firewall-cmd --add-service=rpc-bind --permanent && firewall-cmd --add-service=rpc-bind
    • 添加mountd防火墙策略(远端查看showmount需要)firewall-cmd --add-service=mountd --permanent && firewall-cmd --add-service=mountd
    • 端口信息可以从grep 2049 /etc/services中看到;
    • 查看共享目录showmount -e server4
  1. 在desktop4上:
    • 新建挂载点mkdir /mnt/nfsshare
    • 挂载mount server4:/nfsshare /mnt/nfsshare
    • 永久挂载echo 'server4:/nfsshare /mnt/nfsshare nfs defaults,_netdev 0 0' >> /etc/fstab && mount -a
  1. 共享权限问题:
    • 若共享不可写,则检查model模型及SELinux;共享时虽然由root发起nfs-server进程,但是实际服务用户是一个名为id nfsnobody的内置账号,因此需要在server4上授权chmod o+w /nfsshare
    • 在desktop4上强制修改SELinux标签:mount -o context="system_u:object_r:public_content_rw_t:s0" server4:/nfs /media
    • 服务端的配置在/etc/sysconfig/nfs配置RPCNFSDARGS="-V 4.2",desktop4挂载时使用mount -o v4.2 server4:/nfs /media,可以使客户端与服务端文件的SELinux一致;
    • 关于各软件的SELinux目录权限标签可以参考“软件名_selinux(8)”,如man 8 nfsd\_selinux;公共目录读写通常使用public_content_rw_t
  1. 实验:
    • 安装环境:lab nfskrb5 setup
    • 在server4上,下载krb凭证wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/server4.keytab
    • 新建文件夹/securenfs
    • 设置共享/etc/exports写入/securenfs desktop4.exmaple.com(rw,sec=krb5p)
    • 修改nfs版本配置/etc/sysconfig/nfs该为RPCNFSDARGS="-V 4.2"
    • 防火墙添加服务:
      1
      2
      firewall-cmd --add-service=nfs
      firewall-cmd --add-service=nfs --permanent
    • 启动nfs服务:
      1
      2
      3
      4
      5
      6
      systemctl enable nfs-server
      systemctl enable nfs-secure-server
      systemctl start nfs-server
      systemctl start nfs-secure-server
      systemctl status nfs-server
      systemctl status nfs-secure-server

    • 在desktop4上,下载krb凭证wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/desktop4.keytab
    • 新建挂载点mkdir /mnt/sercureshare
    • 启动服务
      1
      2
      3
      systemctl enable nfs-secure
      systemctl start nfs-secure
      systemctl status nfs-secure
    • 挂载mount -o sec=krb5p,v4.2 server4:/securenfs /mnt/secureshare
    • 配置永久挂载:server4:/securenfs /mnt/secureshare nfs4 defaults,_netdev,sec=krb5p,v4.2 0 0
    • 另外,如果挂载时遇到访问被拒绝的问题,可以使用klist /etc/krb5.keytab查看证书问题;
    • 挂载选项中的_netdev选项参见man 8 mount,即网络设备启动过后再执行挂载;

2018-08-01

nfs共享权限

  1. 使用krb认证后,若切换到认证用户身份(如ldapuser1),则权限已经从nfsnobody用户变为认证用户了(即ldapuser1);共享的权限检查顺序为:
    • 共享权限vim /etc/exports
    • model权限ll -d /securenfs,包括ACL权限;
    • SELinux权限ll -dZ /securenfs
  1. 权限试验:
    • 在server4上创建文件:echo 'hello world' > /securenfs/testfile.txt
    • 修改SELinux标签:chron -t public_content_t /securenfs/testfile.txt
    • 修改文件属主为ldap用户:chown ldapuser0:ldapuser0 /securenfs/testfile.txt
    • 修改model权限:chmod 644 /securenfs/testfile.txt

    • 在desktop4上查看共享权限:ls -Z /mnt/shcureshare/
    • 通过认证切换用户为ldapuser4:ssh ldapuser4@localhost
    • 尝试写入失败:echo 'i can't wirte' >> /mnt/seucreshare/testfile.txt,文件对ldapuser4只读;
    • 通过认证切换用户为ldapuser0:ssh ldapuser4@localhost;注意:不可以通过su - ldapuser0,因为这样不会通过krb进行认证;
    • 此时可以写入:echo 'i can't wirte' >> /mnt/seucreshare/testfile.txt
  1. nfs与smb的路径对比:
    • nfs:hostname:/pathname
    • cifs(smb)://hostname/sharename,其中的sharename在/etc/samba/smb.conf中配置;

smb共享

  1. smb(server message block)是一个标准的文件共享协议,用户Windows系统;smb文件服务器可以配置为工作组模式或模式;
    • 工作组绝对平等,每台电脑管理自己的本地用户及密码,不适于大规模管理;
    • 域成员服从域控制器,用户通过域控制器认证;
  1. 创建smb共享:
    • 在server4上安装及查看yum install -y sambarpm -ql samba
    • smb安装完成后提供两个服务:nmb提供netbios服务,解析共享时的域名解析;smb即共享服务;
    • 配置vim /etc/samba/smb.conf,参考man 4 samba
      1
      2
      3
      4
      5
      6
      7
      workgroup = WORKGROUP
      hosts allow =
      [yinhe]
      path = /smbshare/
      # 用户,@组
      write list = smbuser4,@smb
      valid users = smbuser4
    • 使用testparm检查配置文件语法错误;
    • 启动服务
      1
      2
      3
      4
      systemctl enable smb nmb
      systemctl start smb nmb
      # 检查服务:139、445端口已经启动
      netstat -tnlp
    • 配置防火墙:
      1
      2
      firewall-cmd --add-service=samba
      firewall-cmd --add-service=samba --permanent

    • 在desktop4上新建非交互用户,为smbuser4指定非交互shell:useradd -s /sbin/nologin smbuser4
    • 设置smb格式密码:
      1
      2
      3
      4
      5
      6
      7
      8
      # 搜索提供该命令的包
      yum provides smbpasswd
      # 安装该包
      yum install -y samba-client
      # 为用户设置密码
      smbpasswd -a smbuser4
      # 查看该用户
      pdbedit -L
    • 尝试挂载:mount //server4/yinhe /media报错,查看日志tail /var/log/message,发现需要cifs文件系统;
    • 安装cifs文件系统支持yum install -y cifs-utils
    • 指定用户挂载:mount -o username=smbuser4,password=redhat //server4/yinhe /media/

    • 尝试访问被拒绝,在server4中添加SELinux读权限:
      1
      2
      3
      4
      5
      6
      # 查看SELinux标签
      ll -dZ /smbshare
      # 添加读标签,测试后可以访问,注意,chcon只用于临时调试,要永久修改策略应使用semanage
      chcon -t public_content_t /smbshare/
      # 该为写标签
      chcon -t public_content_rw_t /smbshare/
    • 为共享用户smbuser4添加ACL:
      1
      2
      3
      4
      # 查看ACL
      getfacl /smbshare
      # 为smbuser4设置读写ACL
      setfacl -m smbuser4:rwx /smbshare/
    • 尝试写发现写被拒绝,修改SELinux策略:
      1
      2
      3
      4
      5
      6
      # 检查smb权限
      getsebool -a | grep smb
      # 设置写权限
      setsebool smbd_anon_write on
      # 永久生效
      setsebool -P smbd_anon_write on
  2. 多用户挂载
    • 切换student写被拒绝,添加model权限:chmod o+w /smbshare/,我们发现student创建的属主文件也是smbuser4(即文件属于挂载用户);
    • 在server4上初始化实验环境lab smbmultiuser setup
    • 可以看到实验创建了/smbshare协作目录drwxrwsr-x.,并新增了两个账号brain:1001:1001(marketing)rob:1002:1002

    • 在desktop4上初始化实验环境lab smbmultiuser setup
    • 安装cifs:yum install -y cifs-utils
    • 创建认证文件vim /root/multiuser
      1
      2
      username=brain
      password=redhat
    • 配置永久挂载vim /etc/fstab
      1
      //server4/smbshare /mnt/multiuser cifs defaults,_netdev,multiuser,credentials=/root/multiuser 0 0
    • 测试切换briansu - brian
      1
      2
      3
      4
      5
      6
      # 创建文件被拒绝
      touch /mnt/multiuser/testfile
      # 用户名密码认证
      cifscreds add server4
      # 具有读写权限
      touch test
    • 测试切换robsu - rob
      1
      2
      3
      4
      5
      6
      # 创建文件被拒绝
      touch /mnt/multiuser/testfile
      # 用户名密码认证
      cifscreds add server4
      # 具有只读权限
      touch test

2018-08-02

数据库

  1. 安装MariaDB:
    • 在server4上安装服务端,以组安装比较方便:yum groups install MariaDB\ Database\ Server
    • 使用yum history list查看安装历史,使用yum history info 2查看组中安装的包详情
    • 使用rpm -ql mariadb-server | grep .service查看安装的服务;
    • 启动服务:
      1
      2
      3
      4
      systemctl enable mariadb.service
      systemctl start mariadb.service
      # 确认默认端口3306
      netstat -tnlp
    • 添加防火墙:
      1
      2
      firewall-cmd --add-service=mysql
      firewall-cmd --add-service=mysql --permanent

    • 在desktop4上安装服务端,以组安装比较方便:yum groups install MariaDB\ Database\ Client
    • 运行yum history list查看安装历史,运行yum history info 2查看组中安装的包详情
  1. 登录数据库
    • 本地匿名登录,使用mysql客户端:mysql
      1
      2
      3
      4
      5
      SHOW DATABASES;
      USE mysql;
      SHOW TABLES;
      DESC user;
      SELECT user, host, password FROM user;
    • 运行安全脚本禁用匿名用户、远程登录等功能:mysql_secure_installation
    • 使用密码本地登录:mysql -u root -predhat -h localhost,注意-p选项后接密码无空格;
      1
      2
      USE mysql;
      SELECT user, host, password FROM user;
  1. 配置:
    • vim /etc/my.cnf
      1
      2
      3
      4
      5
      6
      7
      # 默认配置指向套接字文件,供同一个电脑的进程间通信使用:
      socket=/var/lib/mysql/mysql.sock
      # bind-address,在所以配置文件中只允许一次,监听本地IP 172.25.0.11:
      bind-address=172.25.0.11
      # 禁用网络,仅使用本地套接字文件(以localhost连接会被自动转为本地套接字,而以server4连接则会被禁用):
      skip-network=1
      # 修改配置使能够远程访问,需要指向
    • 子配置位于ll /etc/my.cnf.d
    • 日志、数据文件、套接字等位于ll /var/lib/mysql
  1. SQL:
    • DDL数据定义语言:create, show, drop, alter等,对象为容器(如表、视图);
    • DML数据管理语言:insert, delete, select, update等,对象为数据记录;
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      -- DDL与DML:
      SHOW HELP;
      -- %通配多位
      SHOW TABLES FROM mysql LIKE '%zone%';
      -- _通配一位
      SHOW TABLES FROM mysql LIKE '_i%';
      -- 创建库
      CREATE DATABASE inventory;
      USE inventory;
      -- 创建表
      CREATE TABLE regions (
      region_id int(8),
      region_name varchar(20),
      country_name varchar(20)
      );
      -- 查看表结构
      DESC regions;
      -- 插入记录
      INSERT INTO regions values (1, 'Asia', 'China');
      INSERT INTO regions(region_id, country_name) value ('Asia', 'Japan');
      UPDATE regions SET country_name='CN' WHERE region_id=1;
    • DCL数据控制语言:grant, revoke等;
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      -- 新建用户
      CREATE USER 'yinhe'@'desktop4.example.com' identified by 'redhat';
      -- 若使用主机名登录有问题,可以尝试使用IP地址登录
      CREATE USER 'yinhe'@'172.25.4.10' identified by 'redhat';
      -- 授予权限
      GRANT SELECT, UPDATE, DELETE, INSERT ON inventory.regions TO 'yinhe'@'desktop4.example.com';
      -- 刷新内存,赋权后建议刷新
      flush privileges;
      -- 回收权限
      REVOKE UPDATE, INSERT, DELETE ON inventory.regions FROM 'yinhe'@'desktop4.example.com';
      -- 查看用户权限
      SHOW GRANTS FOR 'yinhe'@desktop4.example.com'
      -- 用户授权支持SQL用通配符
      mobius@'localhost'
      mobius@'192.168.1.5'
      mobius@'192.168.1.%'
  1. 数据备份
    • 按业务分为冷备(所有业务下线)、温备(业务只读)、热备(所有业务在线);
    • 备份方式分为逻辑备份(通过SQL导出记录,可以不下线,低效、高可移植)、物理备份(复制数据目录,如/var/lib/mysql,需要下线,高效、低可移植);
    • 逻辑备份:
      1
      2
      3
      4
      # 备份
      mysqldump -uroot -predhat inventory > ~/dump.out
      # 还原
      mysql -uroot -predhat abc < /root/dump.out
    • 物理备份:mysqlhotcopy是mysql提供的冷/温备工具,或直接给逻辑卷做快照(lvm snapshots,cow写前复制,所以建议数据文件规划在逻辑卷上);

网页服务

  1. 安装yum install -y httpd
    • 查看配置文件rpm -qc httpd
    • 日志默认存放在/var/log/httpd(同时也会写入系统日志/var/log/message);
    • 内容默认存放在/var/www/html
    • httpd的详细帮助文档,安装yum install -y httpd-manual
  1. 实验,使用/srv/www4.example.com/www/为www4.example.com提供内容,使用/srv/default/www/为其他域名提供内容:
    • SELinux策略已经为/srv/*/www目录授予权限,若遇到403,使用restorecon -vvvR /srv/(v越多显示的过程越详细),使用ll -RZ /srv/查看,发现SELinux已重置为httpd_sys_content_t
    • 虚拟主机配置可以参考/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf,复制到/etc/httpd/conf.d/下,分屏编辑vim -o {default,www4}.conf
    • default配置:
      1
      2
      3
      4
      5
      6
      7
      <VirtualHost *:80>
      DocumentRoot "/srv/default/www/"
      </VirtualHost>
      <Directory "/srv/default/www/">
      AllowOverride None
      Require all granted
      </Directory>
    • www4配置:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      <VirtualHost *:80>
      DocumentRoot "/srv/www4.example.com/www/"
      ServerName www4.example.com
      ServerAlias www4
      </VirtualHost>
      <Directory "/srv/www4.example.com/www/">
      AllowOverride None
      Require all granted
      # Allow,Deny是老版本的访问控制命令,Require是新版本的命令
      # Order allow,deny
      # Allow from all
      # Deny from 172.25.4.10
      # 多条Require放入Require容器:<RequireAny>、<RequireAl>
      # <RequireAny>
      # Require all granted
      # Require not ip 172.25.0.10
      # </RequireAny>
      </Directory>
    • 若有欢迎页面,重命名掉/etc/httpd/conf.d/welcome.conf,注释掉主配置Options Indexes FollowSymLinks
  1. 实验,https(TLS)配置:
    • 生成秘钥对:openssl genrsa 1024 > /root/pair.key
    • 生成新签名请求:openssl req -new -key /root/pair.key -out /root/server.csr
    • 安装SSL支持:yum install mod_ssl.x86_64,查看安装文件rpm -ql mod_ssl,主配置文件为/etc/httpd/conf.d/ssl.conf
    • 添加防火墙:
      1
      2
      firewall-cmd --add-service=https
      firewall-cmd --add-service=https --permanent
    • 备份配置mv /etc/httpd/conf.d/ssl.conf{,.bak}
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      Listen 443 https
      <VirtualHost *:443>
      SSLEngine on
      SSLProtocol all -SSLv2 -SSLv3
      SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
      SSLHonorCipherOrder on
      ServerName www4.example.com
      DocumentRoot /srv/ssl/www/
      SSLCertificateFile
      SSLCertificateKeyFile
      SSLCACertificateFile /etc/pki/tls/certs/ca.crt
      <Directory "/srv/ssl/www/">
      Require all granted
      </Directory>
      </VirtualHost>
    • 重启服务:systemctl restart httpd.server
  1. 实验,部署python网络应用:
    • 安装wsgi插件:yum install -y mod_wsgi.x86_64
    • 修改webapp.wsgi的SELinux标签:
      1
      2
      3
      4
      # 永久改标签
      semanage fcontext -a -t "httpd_sys_content_t" "/srv/wsgi/www(/.*)?"
      # 刷新标签
      restorecon -vvvR /srv/wsgi/www/
    • 修改端口的SELinux标签:
      1
      2
      3
      4
      5
      6
      # 查看9981端口标签
      semanage port -l | grep 9981
      # 查看一般网页端口的标签
      semanage port -l | grep 80
      # 永久改标签
      semanage port -a -t http_port_t -p tcp 9981
    • 修改vim wsgi.conf
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      Listen 9981
      <VirtualHost *:9981>
      DocumentRoot "/srv/wsgi/www/"
      ServerName webapp4.example.com
      WSGIScriptAlias / /srv/wsgi/www/webapp.wsgi
      </VirtualHost>
      <Directory "/srv/wsgi/www/">
      AllowOverride None
      Require all granted
      </Directory>
    • 添加防火墙:
      1
      2
      firewall-cmd --add-port=9981/tcp
      firewall-cmd --add-port=9981/tcp --permanent

2018-08-03

Shell脚本

  1. 脚本文件首行可以写入魔术字:#!/usr/bin/bash,用于指定脚本执行的程序;
  1. 使用常量创建用户:
    • 创建用户:
      1
      2
      3
      4
      echo "adding user1"
      useradd user1 & > /dev/null
      echo "setting password for user1"
      echo "redhat" | passwd --stdin user1
    • 执行脚本:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 将脚本读入bash子进程执行,ps j能够看到多一个bash子进程
      bash createusers
      # 将脚本读入当前进程运行执行
      source createusers
      # .等效于source
      . createusers
      # 直接运行
      chmod a+x createusers
      /root/createusers
      ./createusers
  1. which路径查找的顺序:alias、hash、$PATH中具有x权限的文件,设置别名:alias cdnet='cd /etc/sysconfig/network-scripts/'
    • which默认查找PATH,找到立刻返回,which -a表示查找PATH中的所有路径;
    • whereis也是路径查找,包man手册;whatis专用于查找man手册,匹配名称,man -k还匹配摘要内容;
  1. $用于变量调用,其他如*, @, #等特殊符号参见man 1 bash中“Special Parameters”;
    • 设置环境变量:export user=user2
    • 变量默认以字符存储,使用[]转换数字:
      1
      2
      3
      a=1
      b=2
      echo $[$a+$b]
    • 使用let数字赋值:
      1
      2
      let c=$a+$b
      echo $c
    • 算数表达式:
      1
      2
      echo $[1+1*2]
      echo $[(1+1)*2]
  1. 退出码0表示正常,非0值各程序定义不同,使用exit 255表示退出码;
  1. 条件判断:
    • 数字比较:[ "$a" -eq "$b" ] && echo true || echo false,注意:中括号前后有空格;
    • 字符串比较:[ "$a" == "$b" ] && echo true || echo false,注意:中括号前后有空格;
    • 文件相关信息的条件判断参见man 1 bash的“Conditional Expressions”;
    • 判断语句if,参见help if
      1
      2
      3
      4
      5
      6
      if xxx ; 
      then ... ;
      elif ... ;
      then ... ;
      else ... ;
      fi
    • 判断语句case,参见help case,实验:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      #!/bin/bash
      case $* in
      redhat)
      echo fedora ;;
      fedora)
      echo redhat ;;
      *)
      echo "/root/foo.sh redhat|fedora"
      esac
    • 添加运行权限chmod a+x foo.sh
  1. 循环语句:
    • for语句:
      1
      2
      3
      for in {1..100};
      do echo $i;
      done
    • 判断PC是否在线:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      #!/bin/bash
      for i in {1..20}
      do ping -c1 172.25.254.$i > /dev/null
      if [ $? -eq 0 ]
      then echo pc${i}:online
      let sumon++
      else
      echo pc${i}:online
      let sumoff++
      if
      done
    • while语句:
      1
      2
      3
      while: xxx
      do ...;
      done
  1. 表格处理:grep w /etc/passwd | cut -d: -f 1,7
  1. 实验,用到的文件newusers每行形为Cassy:Rundle:60:1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
    if [ $# -ne 1 ]
    then
    echo 'Usage: /root/batchusers filename'
    exit 256
    elif [ -f $1 ]
    then
    for username in `cut -d: -f1 $1`
    do
    echo $username
    useradd -s /bin/false $username
    done
    else
    echo 'input file not found'
    exit 128
    fi

Redhat Linux初体验(1)
Redhat Linux初体验(2)

结语

  • 特别感谢李老师在授课之余,带我刷猪肘饭和骨汤面;
  • 感谢成都天气控制部门一直将盛夏的气温保持在25℃左右,湿度也刚刚好,我现在知道成都妹纸为啥皮肤好了[捂脸];
  • 感谢金开服务公寓的免费撸铁房;
  • 感谢东哥拐我来成都培训[捂脸]。
  • 特此批评西安的天气控制部门,连续的40℃还说自己是啥线城市?

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×