1.4http的配置详解-2访问控制(IP),日志,别名等

498 阅读6分钟

http的基本配置详解-2

未来要学:

类型            工具名称
文本处理        grep,sed,awk
数据传输        Rsync,Scp,Inodify/Sersync
进程管理        Supervisor
# 用systemctl管理服务,进程死了就是死了
# 用Supervisor管理服务,进程死了可以再生,相当于多了个监控
性能分析        top,free,df,iftop,vmstat,sar,sysdig
网络服务        vsftp,nfs,samba,bind,dhcp,postfix
web服务         Apache,Nginx-1,Tomcat-1,JBoss,Resin
#nginx功能强大,性能好,配置简单
数据库          MySQL,MariaDB,PostgreSQL,Oracle
NoSQL           Redis,MongoDB
消息中间件      RabbitMQ,ActiveMQ
版本管理        SVN,Git-1
静态缓存        Squid,Varnish,Nginx-1
负载均衡        LVS-1,HAProxy,Nginx-1
高可用软件      Keepalived,Heartbest,DRBD,corosynac+pacemaker
集中管理工具    Ansible-1,Saltstack,Chef,Puppet
虚拟化          KVM,Xen,Openstack,Cloudstack
容器化          Docker-1,Kubernetes-1,Rancher,Openshift
自动装机        kickstart,cobbler
抓包分析        Tcpdump,Wireshark
持续集成        jenkins-1,Github
MySQL代理       Altas,Cobar,Mycat
压测            ab,fio,sysbench,mysqlslap,jemter
日志系统        ELK Stack-1,Grayiog
监控            Zabbix,Prometheus-1,Open-falcon
分布式文件系统  Coph,FastOFS

作者:WangJian
链接:https://juejin.cn/post/1cd248f867
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

后面要学的有很多这才刚刚开始

有些知识是协议级的,属于基础知识

接http配置详解1

3.9 可实现访问控制的资源

可以针对文件系统和URI(大部分用的都是URL)的资源进行访问控制

文件系统路径:

# 基于目录
<Directory "/path">
...
</Directory>

# 基于文件
<File "/path/file">
... 
</File>

# 基于文件通配符
<File "/path/*file">
...
</File>

# 基于正则表达式
<FileMatch "regex">
...
</FileMatch>

范例:

<FilesMatch ".+\.(gif|jpe?g|png)$">  
# .+一个以上的任意字符
# ?有或没有
# ...


<Files ".ht*">  通配符
# .就是点,没有任何含义
	Require all denied 全部拒绝
</Files>

URL路径

<Location "URL">
...
</Location>

<LocationMatch "regex">
...
</LocationMatch>

范例:

#/privatel,/pricatel/,/rovatel/file.txt 匹配
#/privatelother 不匹配
<Location "/parivatel">
# 精确匹配,x/满足
	# ...
</Location>

#/private2/,/private2/file.txt 匹配
#/private2,/private2other 不匹配
<Location "/private2/">
# 精确匹配,x/满足,x不满足
	# ...
</Location>

# 这个细节要注意

范例:

<Location /status>
<LocationMatch "/(extra|special)/data">

3.10 针对目录实现访问控制

1.Options指令

后跟1个或多个以空白字符分隔的选项列表,在选项前的+,-表示增加或删除指定选项

常见选项:

  • Indexes:指明的URL路径下不存在于定义的主页面资源相符的资源文件时,返回索引列表给用户

默认是不允许显示目录列表的,是有危险的,这样用户就想看什么挑着看,网站不是用户说的算,是网站说的算,不要开启

  • FollowSymLinks:允许访问符号链接文件所指向的源文件
  • None:全部禁用

禁用返回索引和软链接

  • ALL:全部允许

查看默认值

删掉主页文件index.html
建立a.html
建立dir1目录
建立ln -s /etc/passwd b.txt 软链接
建立test目录
移动上面三个到test目录
浏览器访问IP/test
# 会发现返回了索引列表,直接跳转到passwd里去了,很危险
# 相当于提供了一个下载网站了
# 如果有index.html页面就不会列了
注意:之前把根目录改了,改回来

范例-对目录控制:

cp -r test test2
# test2不关,test关了
vim /app/http24/conf.d/test.conf

<directory /app/httpd24/htdocs/test>
options -indexes
# -表示把功能关闭
</directory>

httpd -t检查语法
systemctl restart httpd
# 再访问
Forbidden
You don't have permission to access this resource.
注意:做完每一步功能都要检查功能是不是实现,比如说我在这里就碰到了一个错误
,语法上检查syntax OK,但是逻辑上出错了,htdoc少加了个s,如果我没在浏览器
验证,可能就 会被钻了空子,如果这个文件夹下有重要文件,锅都甩不出去

范例-对软连接控制:

<directory /app/httpd24/htdocs/test>
options -FollowSymLinks
</directory>
能看到文件列表,但是软连接没有返回给用户,浏览器看不到了

2.AllowOverride

与访问控制相关的哪些(indexes,FollowSymLinks)指令可以放在指定目录下的.htaccess(由AccessFileName指令指定,AccessFileName.htaccess为默认值)文件中,覆盖之前的配置指令,只对语句有效

常见用法:

  • AllowOverride All: .htaccess中所有指令都有效
  • AllowOverride None: .htaccess中所有指令都无效,这是httpd2.3.9以后版本的默认值
  • AllowOverride AuthConfig: .htaccess中除了AuthConfig其他指令都无法生效

AuthConfig用于身份验证

范例

vim /app/httpd24/conf.d/test.conf
<directory /app/httpd24/htdocs/test2>
allowoverride all
</directory>

cd /app/httpd24/htdocs/test2
vim .htaccess
options -FollowSymLinks -indexes
因为不属于配置文件,只是在目录下加的设置,所以不需要重启服务

注意:如果定义了两个,优先用上面的配置
<directory /app/httpd24/htdocs/test>
options -FollowSymLinks
</directory>

<directory /app/httpd24/htdocs/test>
allowoverride all
</directory>

范例:.htaccess文件默认被禁止访问

注意:通过这样对目录实现访问控制后,如果知道文件夹低下有这样一个文件,还是可以访问
10.0.0.7/test2/.htaccess 这个不可以访问
httpd.conf里面有一个.ht的访问控制
[root@localhost htdocs]# grep -Ev "^ *#|^$" /app/httpd24/conf/httpd.conf |grep -A 2 "ht\*"
<Files ".ht*">
    Require all denied
</Files>

3.11 基于客户端IP地址实现访问控制

针对各种资源,可以基于以下两种方式的访问控制:

  • 客户端来源地址
  • 用户账号

基于客户端的IP地址的访问控制:

  • 无明确授权的目录,默认拒绝

  • 允许所有主机访问:Require all granted

  • 拒绝多有主机访问:Require all denied

  • 控制特定的IP访问

    Require ip IPADDR:授权之地那个来源的IP访问

    Require not ip IPADDR:拒绝特定的IP访问

  • 控制特定的主机访问:

    Require host HOSTNAME:授权特定主机访问

    Require not host HOSTNAME:拒绝

    ​ HOSTNAME:

    ​ FQDN:特定主机

    ​ domin.tld:指定域名下的所有主机

    不能有失败,至少有一个成功匹配才成功,即失败优先

    <RequireAll>
    Require all granted
    Require not ip 172.16.1.1 # 拒绝特定IP
    </RequireAll>
    # 相当于黑名单
    

    案例:

    <directory /app/httpd24/htdocs/test2>
    <RequireAll>
            Require all granted
            Require not ip 10.0.0.1
    </RequireAll>
    </directory>
    # 除了10.0.0.1以外的其他ip都可以访问test2目录
    systemctl restart httpd24.service
    
    在10.0.0.1上测试
    curl 10.0.0.52/test2
    或者浏览器 10.0.0.52/test2
    forbidden拒绝
    

    多个语句有一个成功则成功,即成功优先

    <Requireany>
    Require all denied
    require ip 172.16.1.1 # 允许特定IP 
    </Requireany>
    # 相当于白名单
    

    案例:

    <directory /app/httpd24/htdocs/test2>
    <RequireAny>
            Require all denied
            Require  ip 10.0.0.1
    </RequireAny>
    </directory>
    # 除了10.0.0.1以外的其他ip都不可以访问test2目录
    systemctl restart httpd24.service
    
    在10.0.0.1上测试
    curl 10.0.0.52/test2
    或者浏览器 10.0.0.52/test2
    可以访问
    其他IP访问拒绝,就算自己访问自己也是被拒绝
    

    提示:早期版本使用mod_access_compat模块提供的Allow,Deny,Order指定,将被废弃,不推荐使用

3.12 日志设定

httpd有两种日志类型

  • 访问日志
  • 错误日志

3.12.1 错误日志

# 警报级别
logLevel warn  # logLevel 可选值:debug,info,notice,warn,error,crit,alert,emerg (从左到右严重性越来越高,默认warn,达到warn以上的都会被记录)
Errorlog logs/error_log
# 记录到哪,相抵位置是server的根
# ServerRoot "/app/httpd24"
# 访问被拒绝也会被记录
[root@localhost htdocs]# grep -Ev "^ *#|^$" /app/httpd24/conf/httpd.conf |grep ErrorLog
ErrorLog "logs/error_log"

3.12.2 访问日志--一定要懂,工作中要改

很重要,分析一天的访问量,分析这些访问都是从哪个ip来的,这个ip从全球哪个地 址来的,偏好访问哪个资源,访问量重复次数最多

未来方向:

现在是应用级运维方向
还有大数据运维方向,从数据中分析
现在应用运维学完了,可以往大数据方向走,hoodop等,人少,红海
  • 定义日志格式

    LogFormat format nickname
    
  • 使用日志格式

    CustomLog file nickname(格式的别名)
    

范例:

LogFormat "%h %l %u %{%F %T}t "%r" %>s %b "%{Referer}i"\"%{User-Agent}i\"" testlog

%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为一个减号"-"
%u 验证(basic,digest)远程用户,非登陆访问时,为一个减号"-"
%t 服务器收到请求时的时间
%r First line of request 表示请求报文的首行;记录了此次请求的“方法,“URL”以及协议版本
%>s 最后响应状态码,响应码可能有多个
%b 响应报文大的大小,单位是字节;不包括响应报文http首部,表示纯文件大小
%{Referer}i 请求报文中首部"referer(前一个网站,从哪个网站跳转过来的)"的值;即从哪个页面中的超链接跳转至当前页面的
%{User-Agent}i 请求报文中首部”User-Agent“的值;即发出请求的应用程序
# 官方文档
http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats

范例:查看common默认值

# 查看默认值
[root@localhost htdocs]# grep -Ev "^ *#|^$" /app/httpd24/conf/httpd.conf |grep LogF
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
定义了三种格式
# 或者直接去看官方文档
[root@localhost htdocs]# grep -Ev "^ *#|^$" /app/httpd24/conf/httpd.conf |grep Cust
    CustomLog "logs/access_log" common
默认用的是common的定义

10.0.0.52 - - [25/Mar/2020:21:01:00 +0800] "GET /test2 HTTP/1.1" 403 199
%h %l %u %t \"%r\" %>s %b
访问的IP 没值 非登陆访问 
本地时间(+0800表示相比格林尼治时间多了8h,我们的地区在东八区)(”要记录下
来需要转义,认为就是普通的双引号不是外面的双引号) 请求的第一行 响应状态码 响应报文大小 


[root@localhost htdocs]# curl -I 10.0.0.52/test2
HTTP/1.1 403 Forbidden
Date: Wed, 25 Mar 2020 13:39:29 GMT
Server: Apache
Content-Type: text/html; charset=iso-8859-1
10.0.0.52 - - [25/Mar/2020:21:39:29 +0800] "HEAD /test2 HTTP/1.1" 403 -

正常访问响应码200,403被拒绝

范例:查看combinedio默认值

[root@localhost htdocs]# vim ../conf/httpd.conf
CustomLog "logs/access_log" combined

[root@localhost htdocs]# httpd -t
Syntax OK
systemctl restart httpd24.service

[root@localhost htdocs]# tail ../logs/access_log -f   跟踪日志
10.0.0.50 - - [25/Mar/2020:22:14:19 +0800] "GET /test/ HTTP/1.1" 200 286 
"-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic 
ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
centos78不显示这么多
# 爬虫:就是从各大网站爬下来网页,比如说求职的那种,分析现在哪种职位需要人
# 但是爬虫有风险,爬虫写不好把人家网站爬塌了,人家可以告你
# 爬虫职业有风险,大部分网站都有防爬虫的,怕你把人家网站爬塌了
# 如何防,比如说人家看你这个请求从哪来的,频率怎么样
# 爬虫有反爬技术就可以模拟浏览器访问
# 这个东西可以伪造,很简单的
curl -A ie9 http://10.0.0.7/
10.0.0.50 - - [25/Mar/2020:22:19:47 +0800] "GET /test/ HTTP/1.1" 200 286 
"-" "ie9"

3.13 设定字符集

设定字符集指令

AddDefaultCharset UTF-8 # 这是默认值,支持全球语言

中文字符集:GBK,GB2312,GB18030

[root@localhost ~]# curl http://www.beijing.gov.cn -I -A i9x
HTTP/1.1 200 OK
Date: Wed, 25 Mar 2020 14:23:53 GMT
Content-Type: text/html; charset=gb2312  简体中文gb2312
# 如果没有写,就是默认utf-8
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
Expires: Wed, 25 Mar 2020 14:19:15 GMT
Cache-Control: max-age=60
X-Via-JSL: 0d60de7,-
Set-Cookie: __jsluid_h=82bcb9b529d841de19c82bf9fd721cd4; max-age=31536000; path=/; HttpOnly
X-Cache: bypass

3.14定义路径别名-不把所有资源放在主目录下

格式:

Alias /URL/ "/PATH"
# 访问的URL,不是真实的相当于一个别名
# 彻底指向另一个文件夹下了

范例:

要先授权才能访问
<directory /opt/study>
require all granted
# 这是全部授权,谁都可以访问
</directory>
alias /study/ /opt/study/  
访问IP/study  实际上访问的是IP/opt/study
# 还需要在/opt/study下创建index.html否则会报fobbiden403
[root@localhost htdocs]# echo "xxx">/opt/study/index.html
[root@localhost ~]# curl http://10.0.0.52/study/
xxx

log

2020.3.25 22.47