OpenSSH和创建私有CA,http协议基本原理以及httpd基本应用(第20天)

OpenSSH:
ssh: secure shell, protocol, 22/tcp, 安全的远程登录
OpenSSH: ssh协议的开源实现;
dropbear:另一个 ssh协议的开源实现;

SSH协议版本
v1版本: 基于CRC-32做MAC,不安全;man-in-middle
v2版本:双方主机协议选择安全的MAC方式
       基于DH算法做密钥交换,基于RSA或DSA算法实现身份认证;

两种方式的用户登录认证:
基于password:第一次通过客户端登录的时候,服务器端会发送公钥给客户端(),客户端使用这个公钥给对称密钥加密,发送给服务器端,服务器端使用自己的私钥解密,解密出来对称密钥。后续双方的通信包都通过对称密钥加密之后传输。
基于key (首先必须在客户端生成一对密钥,并将公钥发送给服务器端的/home/USER/.ssh/目录下)
ssh-keygen -t rsa     就可以生成id_rsa(私钥)和id_rsa.pub(公钥)




OpenSSH:
OpenSSH:是C/S架构:
Client: ssh, scp, sftp
     Windows客户端:xshell, putty, securecrt, sshsecureshellclient
Server: sshd


客户端组件:ssh
配置文件:/etc/ssh/ssh_config
格式:ssh [user@]host [COMMAND]
          ssh [-l user] host [COMMAND]
                  -p port:远程服务器监听的端口;
                  -X: 支持x11转发;
                  -Y:支持信任的x11转发;
例子:
ssh -l root 192.168.62.159               用root登录192.168.62.159主机
ssh -l root 192.168.62.159 ifconfig  root在192.168.62.159主机执行ifconfig之后,退出

 基于密钥的认证步骤如下,3个步骤:
(1) 在客户端生成密钥对儿
ssh-keygen -t rsa [-P ''] [-f "/root/.ssh/id_rsa"]   -P表示设置私钥的密码,一般私钥不能随便让用户可以查看,-f表示私钥的保存路径,这样会生成id_rsa和id_rsa.pub两个文件
(2) 把公钥传输至远程服务器对应用户的家目录下
ssh-copy-id [-i [identity_file]] [user@]machine   这里的identity_file就是上一步生成的id_rsa.pub公钥。这一步完成之后,会在服务器端的对应用户的家目录下的.ssh目录下生成authorized_keys文件,该文件就包含有公钥。
(3) 测试

scp命令详解:此命令是基于ssh协议工作的
scp [options] SRC... DEST/
存在两种情形如下,其中,PULL表示从服务器端拉取出来,PUSH表示从客户端推送到服务器端
PULL:scp [options] [user@]host:/PATH/FROM/SOMEFILE /PATH/TO/SOMEWHERE
PUSH: scp [options] /PATH/FROM/SOMEFILE [user@]host:/PATH/TO/SOMEWHERE
scp命令的常用选项:
    -r: 递归复制;
    -p: 保持原文件的属性信息;
    -q: 静默模式
    -P PORT: 指明remote host的监听的端口;


sftp命令:此命令也是基于ssh协议工作的
sftp [user@]host
sftp> help


服务器端:sshd 
配置文件: /etc/ssh/sshd_config
sshd_config常用参数如下:
Port 22022
ListenAddress ip
PermitRootLogin yes

限制可登录用户的办法:
AllowUsers user1 user2 user3
AllowGroups

# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key   服务器首次发送给客户端公钥使用的非对称算法
#HostKey /etc/ssh/ssh_host_dsa_key

#KeyRegenerationInterval 1h   对称密钥使用的时间
#ServerKeyBits 1024    对称密钥长度

# Logging     日志
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV     对应的日志文件为/var/log/secure
#LogLevel INFO

#LoginGraceTime 2m    宽限时间
#PermitRootLogin yes    为了安全,一般禁止root用户通过ssh登录
#StrictModes yes    严格模式
#MaxAuthTries 6    最大认证尝试次数,防止暴力攻击
#MaxSessions 10   最大会话数

#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys   认证的key文件,见上文基于密钥登录认证
#AuthorizedKeysCommand none
#AuthorizedKeysCommandRunAs nobody

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes   允许基于密码登录

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

 # Kerberos options   kerberos认证,一般用于统一认证
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes


# GSSAPI options      GSSAPI认证
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

X11Forwarding yes    允许X11转发(X表示X-windows协议,11表示版本号)


ssh服务的最佳实践:
1、不要使用默认端口;
2、禁止使用protocol version 1;
3、限制可登录用户;
4、设定空闲会话超时时长;
5、利用防火墙设置ssh访问策略;
6、仅监听特定的IP地址;
7、基于口令(密码)认证时,使用强密码策略;
# tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs    生成随机数作为密码
8、使用基于密钥的认证;
9、禁止使用空密码;
10、禁止root用户直接登录;
11、限制ssh的访问频度和并发在线数;
12、做好日志,经常分析;  /var/log/secure


ssh协议的另一个实现:dropbear
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
dropbear -p [ip:]port -F -E     启动dropbear



OpenSSL:有三个组件:
openssl: 多用途的命令行工具;
libcrypto: 加密解密库;
libssl:ssl协议的实现;


PKI:Public Key Infrastructure,公钥基础设施
CA
RA
CRL
证书存取库


建立私有CA的工具有OpenCA和OpenSSL:
OpenCA:封装了OpenSSL
openssl:


证书申请及签署步骤:
1、生成申请请求;提交某些信息,比如主机名,公司信息等等。
2、RA核验;
3、CA签署;
4、获取证书;

创建私有CA的步骤:
openssl的配置文件:/etc/pki/tls/openssl.cnf
 40 [ CA_default ]
 41
 42 dir             = /etc/pki/CA           # Where everything is kept
 43 certs           = $dir/certs            # 发布的证书的保存目录
 44 crl_dir         = $dir/crl              # 发布的证书吊销列表的保存目录
 45 database        = $dir/index.txt        # 数据库索引文件,保存生成的证书的索引
 46 #unique_subject = no # Set to 'no' to allow creation of,证书的subject是否要唯一

48 new_certs_dir   = $dir/newcerts         # default place for new certs. 刚刚签名完成的证书的存放目录

50 certificate     = $dir/cacert.pem  # The CA certificate  CA自己的证书,CA在给其他机构发证书之前,必须先给自己发布一个证书。因为客户端需要用CA自己的证书里的公钥来验证CA给其他机构发布的证书是否合法。
 51 serial          = $dir/serial           # The current serial number  序列号
 52 crlnumber       = $dir/crlnumber        # the current crl number
 53                                         # must be commented out to leave a V1 CRL
 54 crl             = $dir/crl.pem          # The current CRL   当前正在使用的crl
 55 private_key     = $dir/private/cakey.pem  #   CA的私钥
 56 RANDFILE        = $dir/private/.rand    # private random number file

 73 default_days    = 365                   # how long to certify for
 74 default_crl_days= 30                    # how long before next CRL
 75 default_md      = default               # use public key default MD
 76 preserve        = no                    # keep passed DN ordering

(1) 创建所需要的文件
# touch    /etc/pki/CA/index.txt
# echo 01 > /etc/pki/CA/serial
#
(2) 创建CA自签证书,CA自己的证书
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)   生成私钥保存到cakey.pem文件中
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.epm -days 7300 -out /etc/pki/CA/cacert.pem     提取cakey.epm文件中的公钥制作证书cacert.pem
-new: 生成新证书签署请求;
-x509: 专用于CA生成自签证书;(如果不是自签证书就不要这个选项)
-key: 生成请求时用到的私钥文件;
-days n:证书的有效期限;
-out /PATH/TO/SOMECERTFILE: 证书的保存路径;

(3) 发证:有了自签证书,CA就可以给其他机构(比如google.com,Microsoft.com等)发布证书
(a) 用到证书的主机生成证书请求;
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
# openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/httpd.csr    注意:csr文件是证书请求文件,
(b) 把请求文件传输给CA;
(c) CA签署证书,并将证书发还给请求者;
# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365    httpd.crt就是签署完成之后的证书,证书文件的后缀是.crt

查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|-subject|-serial

(4) 吊销证书
(a) 客户端获取要吊销的证书的serial
# openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject

(b) CA
先根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致;

吊销证书:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

(c) 生成吊销证书的编号(第一次吊销一个证书,第一次才要做这一步)
# echo 01 > /etc/pki/CA/crlnumber

(d) 更新证书吊销列表
# openssl ca -gencrl -out thisca.crl

查看crl文件:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

博客作业:加密解密基础、PKI及SSL、创建私有CA;

--------------------------------------------------------------------------------


分层的思想:下层为上层提供服务
不管是web,ssh,dns都需要使用到通信子网。
网络层是主机到主机的通信,通过ip地址通信。
数据链路层和物理层是设备到设备之间的通信。

传输层:提供进程地址,Port number:
传输层一般有TCP和UDP两种协议

tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路完成3次握手;结束后拆除链路4次断开;端口范围0-65535

udp:User Datagram Protocol,无连接的协议;端口范围0-65535

端口号0-1023:众所周知,永久的分配给固定的应用使用,特权端口,22/tcp(ssh), 80/tcp(http), 443/tcp(https)
端口号1024-41951:亦为注册端口,但要求并不是特别严格,分配给程序注册为某应用使用,11211/tcp, 11211/udp (memcached), 3306/tcp(mysql)
端口号41952+:客户端程序随机使用的端口;动态端口,或私有端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range


Socket: IPC的一种实现,允许位于不同主机(甚至同一主机)上不同进程之间进行通信;数据交换;Socket API, 1983年,4.2 BSD
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW: 裸套接字,绕过传输层(不使用TCP或UDP)的套接字。


IPv4地址分类:
A:1-127
B:128-191
C:192-223
D:组播,224-239
E:240-254

私有地址:
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24







TCP协议的特性:
建立连接:三次握手
将数据打包成段:校验和(CRC-32)
确认、重传以及超时:
排序:逻辑序号
流量控制:滑动窗口算法.
拥塞控制:慢启动和拥塞避免算法


Socket Domain(根据其所使用的地址)分类:
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上不同进程之间通信时使用;绕过TCP/IP协议栈

上述每类套接字都至少提供了两种socket:流(TCP)和数据报(UDP)
流:可靠地传递、面向连接、无边界;
数据报:不可靠地传递、有边界(报文从哪开始,从哪结束)、无连接;


套接字相关的系统调用:网络编程需要用到的部分函数
socket(): 创建一个套接字;
bind():绑定
listen():监听
accept():接收请求
connect():请求连接建立
write():发送
read():接收
send(), recv(), sendto(), recvfrom()


http: hyper text transfer protocol, 80/tcp
html: 编程语言,超文本标记语言;

html文件格式:
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1></h1>
<p> blabla... <a href="http://www.magedu.com/logo.jpg"> blabal </a> </p>
<h2></h2>
</body>
</html>

CSS: Cascading Style Sheet

js: javascript

MIME: Multipurpose Internet Mail Extesion  多功能互联网邮件扩展



HTTP协议的工作机制:
http请求
http响应


Web资源:web resource包括如下:
静态文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi
动态文件:.php, .jsp,
媒体类型(MIME类型):major/minor
  text/html
  text/plain
  image/jpeg
  image/gif



URI: Uniform Resource Identifier  统一资源标识符
URL: Uniform Resource Locator,用于描述某服务器某特定资源的位置;
URL格式:Scheme://Server:Port/path/to/resource
例如   http://www.magedu.com/images/logo.jpg
URN: Uniform Resource Naming



http协议版本:
HTTP/0.9:原型版本,功能简陋
HTTP/1.0:第一个广泛使用的版本,支持MIME
HTTP/1.1: 增强了缓存功能
spdy
HTTP/2.0:   到官网查看rfc文档


一次完整的http请求处理过程:
(1) 建立或处理连接:服务器端接收请求或拒绝请求

(2) 接收请求:接收来自于网络的请求报文中对某资源的一次请求的过程;
并发访问响应模型(Web I/O)有如下几种:
单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用I/O结构:一个进程响应n个请求;
                多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
事件驱动:event-driven
复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求;

(3) 处理请求:对HTTP请求报文进行解析,并获取请求的资源及请求方法等相关信息
元数据:HTTP请求报文首部
<method> <URL> <VERSION>
Host: www.magedu.com   请求的主机名称
Connection:

(4) 访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
/var/www/html/
/var/www/html/images/1.jpg
http://www.magedu.com/images/1.jpg

web服务器资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机docroot
(d) 用户家目录docroot

(5) 构建响应报文
资源的MIME类型分类:
    显式分类
    魔法分类
    协商分类

URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径;


(6) 发送响应报文
(7) 记录日志




http服务器程序有如下几种比较常用的:
httpd (apache)
nginx
lighttpd

应用程序服务器:
IIS:windows平台
tomcat, jetty, jboss, resin:java平台
webshpere, weblogic, oc4j
www.netcraft.com    各大服务器市场份额



httpd的安装配置和使用:
httpd:   由apache组织维护
a  patchy server(充满补丁的软件) = apache
ASF: apache software foundation     apache软件基金会

httpd的特性有如下几个:
高度模块化:core + modules, 使用核心加模块的形式
DSO: Dynamic Shared Object,动态共享对象
MPM:Multipath Processing Modules    多路处理模型,有prefork,worker,event
    prefork:多进程模型,每个进程响应一个请求;
首先启动一个主进程,该进程不响应用户请求,而是负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
    worker:多线程模型,每个线程响应一个请求;
一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;
m进程,n线程:m*n
    event:事件驱动模型,每个线程响应n个请求;
一个主进程:生成m个子进程,每个进程直接n个请求; m*n
     httpd-2.2: event为测试使用
     httpd-2.4:event可生产使用


httpd的功能特性:
虚拟主机有3种方式:IP、Port、FQDN
CGI:Common Gateway Interface,通用网关接口;
反向代理
负载均衡
路径别名
丰富的用户认证机制:basic和digest
支持第三方模块


安装httpd:
rpm包直接安装
源码编译安装






















评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用