5172 字
26 分钟
Redhat Linux初体验(3)

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

献上第三周的笔记。

2018-07-30#

防火墙#

  1. 通常使用Firewall Configuration图形界面进行配置更方便;

  2. Ports、Sources等普通规则(单规则)添加时应注意,这些规则的生效是取并集;Rich Rules(富语言规则)用来配置复杂规则,常用语配置交集过滤;

  3. iptables等旧命令使用直接语言规则,在Redhat 7中已经不提倡使用,具体参考man 1 firewall-cmdman 5 firewalld.direct

  4. Redhat 7推荐使用富语言规则,参考man 5 firewalld.richlanguage

    • 查看服务firewall-cmd --get-services
    • 查看区域已经添加或生效的策略firewall-cmd --list-all
    • 查看富语言规则firewall-cmd --list-rich-rules
  5. 实验:仅允许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
    Terminal window
    # 运行时生效
    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
  6. 伪装功能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,通常用于保护内网服务安全;
    • 伪装不需要配置伪装前后的规则,防火墙自动转换;而端口转发需要配置转发前后的规则;
  7. 实验:服务器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的流量:
    Terminal window
    firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.25.4.10/32" port port="8080" portocol="tcp" accept'

    • 为desktop4添加端口转发并开启伪装:
    Terminal window
    # 开启伪装
    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
  2. 配置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

  2. DNS缓存

  3. DNS服务器位于/etc/resolv.conf

  4. 解析过程为:先找DNS静态授权数据,再找本地缓存,最后远程DNS缓存服务器(查找条件转发器forward,最后查找rootDNS服务器);

  5. 查找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记录中;
  6. 搭建缓存名称服务:

    • 安装unbound:yum install -y unbound
    • 修改配置文件:vim /etc/unbound/
    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等服务都是依赖邮件服务的;

  2. 发送邮件:mail -s 'hello student'

  3. 空客户端:禁用本地邮件投递能力,将邮箱投递全部转发到指定服务器中;

  4. 配置postfix邮件服务器:/etc/postfix/mail.cf,可以使用postconf工具,也可以直接编辑;

    • 在desktop4上:重置服务器,lab smtp-nullclient setup
    • 修改邮件服务器配置:vim /etc/postfix/main.cf
    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上发送邮件测试:
    Terminal window
    mail -s 'remote student' student@desktop4.example.com
    # 正文
    hello remote
    # ^D提交
    EOT

2018-7-31#

存储#

  1. DAS(direct attach storage)

  2. NAS(network attach storage):

    • unix-like nfs;
    • Windows smb(cifs)
  3. SAN(storage area network): SCSI

  4. 概念:

    • 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验证登录;
  5. 实验:

    • desktop4上安装initiatoryum install -y iscsi-initiator-utils.i686
    • server4上安装targetyum install -y targetcli.noarch
  6. 在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交互模式:
    Terminal window
    # 创建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
  7. 在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
  2. 在desktop4上:

    • 新建挂载点mkdir /mnt/nfsshare
    • 挂载mount server4:/nfsshare /mnt/nfsshare
    • 永久挂载echo 'server4:/nfsshare /mnt/nfsshare nfs defaults,_netdev 0 0' >> /etc/fstab && mount -a
  3. 共享权限问题:

    • 若共享不可写,则检查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
  4. 实验:

    • 安装环境: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"
    • 防火墙添加服务:
    firewall-cmd --add-service=nfs
    firewall-cmd --add-service=nfs --permanent
    • 启动nfs服务:
    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
    • 启动服务
    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
  2. 权限试验:

    • 在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
  3. nfs与smb的路径对比:

    • nfs:hostname:/pathname
    • cifs(smb)://hostname/sharename,其中的sharename在/etc/samba/smb.conf中配置;

smb共享#

  1. smb(server message block)是一个标准的文件共享协议,用户Windows系统;smb文件服务器可以配置为工作组模式或模式;

    • 工作组绝对平等,每台电脑管理自己的本地用户及密码,不适于大规模管理;
    • 域成员服从域控制器,用户通过域控制器认证;
  2. 创建smb共享:

    • 在server4上安装及查看yum install -y sambarpm -ql samba
    • smb安装完成后提供两个服务:nmb提供netbios服务,解析共享时的域名解析;smb即共享服务;
    • 配置vim /etc/samba/smb.conf,参考man 4 samba
    workgroup = WORKGROUP
    hosts allow =
    [yinhe]
    path = /smbshare/
    # 用户,@组
    write list = smbuser4,@smb
    valid users = smbuser4
    • 使用testparm检查配置文件语法错误;
    • 启动服务
    systemctl enable smb nmb
    systemctl start smb nmb
    # 检查服务:139、445端口已经启动
    netstat -tnlp
    • 配置防火墙:
    Terminal window
    firewall-cmd --add-service=samba
    firewall-cmd --add-service=samba --permanent

    • 在desktop4上新建非交互用户,为smbuser4指定非交互shell:useradd -s /sbin/nologin smbuser4
    • 设置smb格式密码:
    Terminal window
    # 搜索提供该命令的包
    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读权限:
    Terminal window
    # 查看SELinux标签
    ll -dZ /smbshare
    # 添加读标签,测试后可以访问,注意,chcon只用于临时调试,要永久修改策略应使用semanage
    chcon -t public_content_t /smbshare/
    # 该为写标签
    chcon -t public_content_rw_t /smbshare/
    • 为共享用户smbuser4添加ACL:
    Terminal window
    # 查看ACL
    getfacl /smbshare
    # 为smbuser4设置读写ACL
    setfacl -m smbuser4:rwx /smbshare/
    • 尝试写发现写被拒绝,修改SELinux策略:
    Terminal window
    # 检查smb权限
    getsebool -a | grep smb
    # 设置写权限
    setsebool smbd_anon_write on
    # 永久生效
    setsebool -P smbd_anon_write on
  3. 多用户挂载

    • 切换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
    username=brain
    password=redhat
    • 配置永久挂载vim /etc/fstab
    //server4/smbshare /mnt/multiuser cifs defaults,_netdev,multiuser,credentials=/root/multiuser 0 0
    • 测试切换briansu - brian
    # 创建文件被拒绝
    touch /mnt/multiuser/testfile
    # 用户名密码认证
    cifscreds add server4
    # 具有读写权限
    touch test
    • 测试切换robsu - rob
    # 创建文件被拒绝
    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查看安装的服务;
    • 启动服务:
    Terminal window
    systemctl enable mariadb.service
    systemctl start mariadb.service
    # 确认默认端口3306
    netstat -tnlp
    • 添加防火墙:
    Terminal window
    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查看组中安装的包详情
  2. 登录数据库

    • 本地匿名登录,使用mysql客户端:mysql
    SHOW DATABASES;
    USE mysql;
    SHOW TABLES;
    DESC user;
    SELECT user, host, password FROM user;
    • 运行安全脚本禁用匿名用户、远程登录等功能:mysql_secure_installation
    • 使用密码本地登录:mysql -u root -predhat -h localhost,注意-p选项后接密码无空格;
    USE mysql;
    SELECT user, host, password FROM user;
  3. 配置:

    • vim /etc/my.cnf
    # 默认配置指向套接字文件,供同一个电脑的进程间通信使用:
    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
  4. SQL:

    • DDL数据定义语言:create, show, drop, alter等,对象为容器(如表、视图);
    • DML数据管理语言:insert, delete, select, update等,对象为数据记录;
    -- 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等;
    -- 新建用户
    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.%'
  5. 数据备份

    • 按业务分为冷备(所有业务下线)、温备(业务只读)、热备(所有业务在线);
    • 备份方式分为逻辑备份(通过SQL导出记录,可以不下线,低效、高可移植)、物理备份(复制数据目录,如/var/lib/mysql,需要下线,高效、低可移植);
    • 逻辑备份:
    Terminal window
    # 备份
    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
  2. 实验,使用/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配置:
    <VirtualHost *:80>
    DocumentRoot "/srv/default/www/"
    </VirtualHost>
    <Directory "/srv/default/www/">
    AllowOverride None
    Require all granted
    </Directory>
    • www4配置:
    Terminal window
    <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
  3. 实验,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
    • 添加防火墙:
    Terminal window
    firewall-cmd --add-service=https
    firewall-cmd --add-service=https --permanent
    • 备份配置mv /etc/httpd/conf.d/ssl.conf{,.bak}
    Terminal window
    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
  4. 实验,部署python网络应用:

    • 安装wsgi插件:yum install -y mod_wsgi.x86_64
    • 修改webapp.wsgi的SELinux标签:
    Terminal window
    # 永久改标签
    semanage fcontext -a -t "httpd_sys_content_t" "/srv/wsgi/www(/.*)?"
    # 刷新标签
    restorecon -vvvR /srv/wsgi/www/
    • 修改端口的SELinux标签:
    Terminal window
    # 查看9981端口标签
    semanage port -l | grep 9981
    # 查看一般网页端口的标签
    semanage port -l | grep 80
    # 永久改标签
    semanage port -a -t http_port_t -p tcp 9981
    • 修改vim wsgi.conf
    Terminal window
    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>
    • 添加防火墙:
    Terminal window
    firewall-cmd --add-port=9981/tcp
    firewall-cmd --add-port=9981/tcp --permanent

2018-08-03#

Shell脚本#

  1. 脚本文件首行可以写入魔术字:#!/usr/bin/bash,用于指定脚本执行的程序;

  2. 使用常量创建用户:

    • 创建用户:
    Terminal window
    echo "adding user1"
    useradd user1 & > /dev/null
    echo "setting password for user1"
    echo "redhat" | passwd --stdin user1
    • 执行脚本:
    Terminal window
    # 将脚本读入bash子进程执行,ps j能够看到多一个bash子进程
    bash createusers
    # 将脚本读入当前进程运行执行
    source createusers
    # .等效于source
    . createusers
    # 直接运行
    chmod a+x createusers
    /root/createusers
    ./createusers
  3. which路径查找的顺序:alias、hash、$PATH中具有x权限的文件,设置别名:alias cdnet='cd /etc/sysconfig/network-scripts/'

    • which默认查找PATH,找到立刻返回,which -a表示查找PATH中的所有路径;
    • whereis也是路径查找,包man手册;whatis专用于查找man手册,匹配名称,man -k还匹配摘要内容;
  4. $用于变量调用,其他如*, @, #等特殊符号参见man 1 bash中“Special Parameters”;

    • 设置环境变量:export user=user2
    • 变量默认以字符存储,使用[]转换数字:
    Terminal window
    a=1
    b=2
    echo $[$a+$b]
    • 使用let数字赋值:
    Terminal window
    let c=$a+$b
    echo $c
    • 算数表达式:
    Terminal window
    echo $[1+1*2]
    echo $[(1+1)*2]
  5. 退出码0表示正常,非0值各程序定义不同,使用exit 255表示退出码;

  6. 条件判断:

    • 数字比较:[ "$a" -eq "$b" ] && echo true || echo false,注意:中括号前后有空格;
    • 字符串比较:[ "$a" == "$b" ] && echo true || echo false,注意:中括号前后有空格;
    • 文件相关信息的条件判断参见man 1 bash的“Conditional Expressions”;
    • 判断语句if,参见help if
    Terminal window
    if xxx ;
    then ... ;
    elif ... ;
    then ... ;
    else ... ;
    fi
    • 判断语句case,参见help case,实验:
    #!/bin/bash
    case $* in
    redhat)
    echo fedora ;;
    fedora)
    echo redhat ;;
    *)
    echo "/root/foo.sh redhat|fedora"
    esac
    • 添加运行权限chmod a+x foo.sh
  7. 循环语句:

    • for语句:
    Terminal window
    for in {1..100};
    do echo $i;
    done
    • 判断PC是否在线:
    #!/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语句:
    Terminal window
    while: xxx
    do ...;
    done
  8. 表格处理:grep w /etc/passwd | cut -d: -f 1,7

  9. 实验,用到的文件newusers每行形为Cassy:Rundle:60:1

#!/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℃还说自己是啥线城市?
Redhat Linux初体验(3)
https://zlotus.github.io/2018/08/03/redhat-3/
作者
Z
发布于
2018-08-03
许可协议
CC BY-NC-SA 4.0