Linux下实现Apache站点安全
Linux的广泛应用和快速发展得益于互联网的飞速发展。对于Internet上应用广泛的Web服务来说,Linux表现出色。很难说清目前Internet上究竟有多少个网站在使用Linux系统,但众多网站中采用Apache服务器的无疑占据了极大的市场份额。怎么样为网站提供保护,防止非法用户登入呢?通常可以采用身份认证方式。身份认证是防止非法用户使用资源的有效手段,也是管理注册用户的有效方法。现在很多网站都使用身份认证来管理用户资源,对用户的访问权限进行严格地限制。传统的身份认证方法是通过检验用户的注册名、口令,来决定是否允许用户使用资源,但这种认证方法在某些情况下作用并不十分有效。特别是在Linux平台下的Apache服务器,完全可以用Linux的方法来实现密码验证和保护。我们就通过windows平台的IIS与Linux平台的Apache来实现web服务器的身份验证、来源控制以及证书访问的https来。Windows平台的IIS实现web站点的安全性先要在Windows操作系统的计算机上安装windows组件IIS搭建web站点需要有网站主目录,我们只是简单的建立一个主目录以供实验使用,我们需要在IIS添加我们网站的主目录。Windows下实现web站点安全性的方法主要有三种:身份验证、来源控制以及https证书验证。身份验证:Web站点使用身份验证后,访问网站需要对身份进行验证,验证成功后方可访问网站。来源控制:网站实现https证书访问,由于实验环境的原因,我们就不做验证,只说一下设置方法。Windows平台的三种web站点安全方式只是粗略的介绍一下,我们还是把精力放在Linux平台的apache站点安全,由于市场占有份额的问题。Linux平台的Apache实现web站点的安全性身份验证我们的Red Hat Enterprise Linux 5.4 系统平台首先需要安装httpd服务(即Apache)# mkdir /mnt/cdrom 建立光盘挂载点# mount /dev/cdrom /mnt/cdrom光盘挂载我们建立的挂载点# rpm -ivh /mnt/cdrom/Server/httpd-2.2.3-31.el5.i386.rpm安装httpd服务软件包# rpm -ql httpd 查看httpd软件包安装产生的文件这些前期准备工作准备好了,我们需要对站点的身份验证进行配置Httpd.conf配置文件修改在我们httpd服务的默认网站主目录建立一个简单的网页页面以供实验使用# cd /var/www/html/# lltotal 0# echo "Hell welcome to my web" >index.html产生身份验证的一个说明文件# vim .htaccess说明文件内容authuserfile /var/www/.htpasswd 验证使用的账号库文件authname"please input your name and password" 身份验证对话框提示信息authtypebasic 验证方式采用basicrequire valid-user 身份验证通过说明文件已经建好了,我们需要产生我们身份验证的账号库文件# htpasswd -c .htpasswd user 建立用户名为user的用户到.htpasswd账号库文件,第一次建立需要添加“-c”,以后添加账户不在需要添加此参数New password: 输入两次密码Re-type newpassword:Adding passwordfor user user# cat .htpasswduser:4h3Cakaq/NENk 账号库文件中的用户名以及加密后的密码这些工作做好之后,我们重启httpd服务# service httpd restartStoppinghttpd: Startinghttpd: [ OK]在浏览器访问我们的web站点来源控制来源控制只需对httpd.conf配置文件进行修改就可以实现我们测试web站点的主机ip地址为192.168.30.10,我们修改httpd.con配置文件除192.168.30.10外所有主机都可以访问。修改过配置文件后,重启httpd服务,如果实验效果没有达到预期的来源控制效果,有可能是浏览器缓存的临时文件及cookies造成的,删除浏览器的临时文件和cookies即可。加密访问https由于http协议是以明文方式传递,有关金融或者机密的网站访问很可能会被窃听或者抓包,因此产生一种加密访问方式https,我们在访问一些购物网站或者银行的一些网站就会发现网址前缀是https,这些都是采用加密访问的网站。原理:HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:1.浏览器将自己支持的一套加密规则发送给网站。2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。3.获得网站证书之后浏览器要做以下工作:a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。4.网站接收浏览器发来的数据之后要做以下的操作:a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。b) 使用密码加密一段握手消息,发送给浏览器。5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:非对称加密算法:RSA,DSA/DSS对称加密算法:AES,RC4,3DESHASH算法:MD5,SHA1,SHA256其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。原理图:https通信的优点:
1)客户端产生的密钥只有客户端和服务器端能得到;
2)加密的数据只有客户端和服务器端才能得到明文;
3)客户端到服务端的通信是安全的。 Linux平台可以通过工具实现openca、openssl,openca工具功能强大但使用设置起来比较繁琐,我们就是用比较简单一些的openssl来做本次的实验。实验环境:Red Hat Enterprise Linux 5.4、httpd-2.2.3-31.el5.i386.rpm、mod_ssl-2.2.3-31.el5.i386.rpm拓扑图:# rpm -qa |grep opensslopenssl-0.9.8e-12.el5 通过查询可知我们Linux平台已经安装过openssl软件包# openssl –help 查看openssl使用方法以及参数openssl:Error:'--help' is an invalid command.Standard commands 标准参数asn1parse ca ciphers crl crl2pkcs7 dgst dh dhparam dsa dsaparam enc engine errstr gendh gendsa genrsa nseq ocsp passwd pkcs12 pkcs7 pkcs8 prime rand req rsa rsautl s_client s_server s_time sess_id smime speed spkac verify version x509
Message Digestcommands (see the `dgst' command for more details) 摘要参数md2 md4 md5 rmd160 sha sha1
Cipher commands(see the `enc' command for more details) 密文参数aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb base64 bf bf-cbc bf-cfb bf-ecb bf-ofb cast cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb des des-cbc des-cfb des-ecb des-ede des-ede-cbc des-ede-cfb des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofbdes-ofb des3 desx rc2 rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb rc4 rc4-40 实现摘要文件openssl md5/sha 文件名信息 echo“信息” |openssl md5/sha# openssl md5 install.logMD5(install.log)=015db88dd2ead03e585b19dc896f21ee# echo "hello" |openssl shaddedaa052ea8a1b8f827fc0a209a464158898a10实现文件加密openssl des3(加密算法) -a(64为编码)-in 输入文件名–out 输出文件名#openssl des3 -a -in install.log -out f1enter des-ede3-cbcencryption password:Verifying - enterdes-ede3-cbc encryption password:# vim f1
U2FsdGVkX18ZgiqH5RB8hOeKLKGqg/Y2NNLYSvV4sqMM9Rga56NafuV5SpixRD1ZLRYjk//8tVjN2WL39io1L7NSTdUDOMX6eIgfBeAXpOeLHvrqjOjypwmdc9+KB6KwEloE1DukzjEGQ1tALNg6X5zSJwgZbQFUBBt6ik7ESLDzMdL/Peg02ExNKKJA1nO1tT3InJSNXkjSSsXzMD0UR4sf6zJ8+Kgrz+H1KDmewKSeYIEOV/GjwDFHV2geFpaaGaeoyCRZd1RT6RGODX62hZ4BNitZ7Y6gcshjU3vE/gk/V/7PTuw9KQU3msEzV4Cr7IVIBrse6pV+BT28G0hMFhcj5WOFM6bInKWE5uzbJPsXRD6V5szdBpPGskmgn0D1VBvqgNkLC8Lj8eIANLyelUMZef8ScKk+mmOrm2ZarEXaqy5jtJWqS1t8xAyNZ7DiSHwwtrTThPsrtV9cgbIrshouPyPGg76j+qibYST9l23XifOSt4PJ/GMpZX2yv88LT17mFL3IgOncgkIQRQkeQFDNIhniiX/6FibIQgcoGQVdqmzDAA/fMPOJEkwQdXmVtVti+e7AWGR2H29EAO9lPbPl24R5OocgWYi1fBxeAZDUqqnlmlg2HCo7dlhpftKiKN0MFeFes6KwjzgEFLGs7d9k55Tvyh6lGFO/UeELxEHldKBpOfnFODO58ytlSGZN6D8bS09cDJ7X5FDGEY8LOnjrGuwf3l6nH3kek/bGpM74Y50/22vu+ykQLCRw0YQm7hUwdj1xCZiRNgUc6k18uXeQsFUft95elpZUB8duadBJgRLaRqt2DOWwoTpddRZItTHUdSXd1HZwkX4mcvC5iHvFl20bdjAkq8s4bCR5ctP3V+rb0HBzrE2YgvVNT+9FV4IY+B7sNie9aTY5LAPRCXRcL7XXDLUZwsB/Cz8ESga6Mr18ayjinimR/bZqbRZtakt1oR1P3L47PPoIl21l4xz0/cBOZ6iIeByNRH29lK+UmC8m5urd5vDLNlPAUuHRbYC0isM0tu3MvWuLO3L2FYxES9Fj9z1IzhtmaGPqF+/rPzhG29RtX94vfkqkfoLwhuNoML+GAwlx2x+q+kCx/NH3WZBr/8OZUjJa1OCtocbpzaMzf3e3eze3ywwCKHfOigIBJCEz+kfSmRpgRbL/jY+KiUTcTbJOzRECRf2CGl8WwAzjiWd9Msk8MFMCaHFE文件解密openssl des3(加密时使用的加密算法)-a(采用64位编码的加密)-d(解密是添加参数)-in 要解密的加密文件名–out 解密后的文件名# openssl des3 -a -d -in f1 -out f2enter des-ede3-cbcdecryption password:生成自己的1024位私钥并将私钥写入privatekey.pem文件,对其修改权限以增加私钥安全性。# openssl genrsa 1024 >privatekey.pemGenerating RSAprivate key, 1024 bit long modulus..++++++....++++++e is 65537 (0x10001)# lltotal 1-rw-r--r-- 1 rootroot 887 Aug 23 21:34 privatekey.pem# chmod 600 privatekey.pem# lltotal 1-rw------- 1 rootroot 887 Aug 23 21:34 privatekey.pem查看私钥文件privatekey.pem文件内容# vim privatekey.pem
-----BEGIN RSAPRIVATE KEY-----MIICXAIBAAKBgQDdkWD6caEH9NatMNgcJ0tJMTQRzTPzS+QHG9R1HiJcE9IqZToNeBcFF6dFcVkkfGZB/qnuXlPfOss/AnQyZ/zjvn9IwSlf7l4kkmYyg2a5i2BxlazFGuCiwWke+lR8cyI3UzlYpehthiWxIM+7zoTRXZbiIPTrquDLn8dU0XSoiwIDAQABAoGBAIcXGn/YRAxr1XAnNbyEoLxxiYPJD4GppdBHwZPe2ag2VY+PxINt0utB7rTCVU2Po3FdahJx5MVYPY+fWWVaTa8ThSetnX4i8URlPz/cT2YB0TwuCvkfqLGGlb7VMoGMAZ2Hb+xv/oKDaTD1DnocuaZU5Ee+oOJyJ844KdfXYKNxAkEA8bJunaBHd8QTh2x4HF6xQGV/DkS45DtM5KMUUyYwpAO/9gFjj4KHXJfgdZ2SfdPQ2xEP0Le+Zb/8ytTfzT4DXQJBAOquAKAgRTE4haETF3gq7yhtXx1hamn3A3n8jcRfxuROFYOMEND7QyMi5bTzWuvTT0VLz5qd9nkZEPMO7bYcxQcCQBrzlrolAVMtni/fvJUNSh6wMrbYmvV4V163gLC09X+Um3dHOF7sY0PD+9ehtpApaoTDJkxT8PtPqVTE4B/25lECQBl6WJEJz9k/JKrPEs42Aw7liNz8tXvZmGQG+jEmoMYqgAVvEGhPzwMih8O0Y9uUble8mkZT/e05vnBU35PU3cMCQBPhetbrAIgSvG0mx/x3x3TZgcIuNioI8iI0l1cBhXEGcxz+A5Hm9YpItivzWGAjjmMYvzCKr4DPQoWJ+lqn5XU=-----END RSAPRIVATE KEY-----公钥是由私钥文件中提取出来的# openssl rsa -in privatekey.pem -pubout -out public.keywriting RSA key# lltotal 1-rw-r--r-- 1 rootroot 272 Aug 23 21:48 public.key查看私钥文件中提取出来的公钥文件# vim public.key
-----BEGIN PUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdkWD6caEH9NatMNgcJ0tJMTQRzTPzS+QHG9R1HiJcE9IqZToNeBcFF6dFcVkkfGZB/qnuXlPfOss/AnQyZ/zjvn9IwSlf7l4kkmYyg2a5i2BxlazFGuCiwWke+lR8cyI3UzlYpehthiWxIM+7zoTRXZbiIPTrquDLn8dU0XSoiwIDAQAB-----END PUBLICKEY-----搭建CA认证中心证书申请流程:实体私钥 ---》请求文件---》证书根CA 私钥---》证书由于我们搭建的是根CA,所以不需要产生请求文件,只需要直接产生证书。修改/etc/pki/tls/openssl.cnf配置文件# cd /etc/pki/CA/ # lltotal 8drwx------ 2 rootroot 4096 Jun 302009 private# mkdir certs newcerts crl# touch index.txt serial# lltotal 20drwxr-xr-x 2 rootroot 4096 Aug 23 22:14 certsdrwxr-xr-x 2 rootroot 4096 Aug 23 22:14 crl-rw-r--r-- 1 rootroot 0 Aug 23 22:14 index.txtdrwxr-xr-x 2 rootroot 4096 Aug 23 22:14 newcertsdrwx------ 2 rootroot 4096 Jun 302009 private-rw-r--r-- 1 rootroot 0 Aug 23 22:14 serial# echo "01" >serial 由于serial文件是证书的序列号,我们需要给它赋值,这里就赋值01给它由于我们搭建的是CA验证中心,需要有执照证明具有一定的权威性,现在需要产生CA中心的私钥文件,我们采用1024位的私钥。# openssl genrsa 1024 >private/cakey.pemGenerating RSAprivate key, 1024 bit long modulus............++++++..........................++++++e is 65537(0x10001)# ll private/total 4-rw-r--r-- 1 rootroot 887 Aug 23 22:20 cakey.pem我们的私钥并不是任何人都能够读取,对其修改权限,只允许管理员读取。# chmod 600 private/*root@localhostCA]# ll private/total 4-rw------- 1 rootroot 887 Aug 23 22:20 cakey.pem根CA证书的产生在openssl.cnf配置文件中修改我们搭建CA认证中心的条件,我们在上边已经配置过了,这里就不必再次配置了。我们在产生证书的时候会要求我们输入有关信息,我们在openssl.cnf配置文件中修改这些默认值,并将证书信息匹配策略的match修改为optional。
产生CA认证中心的运行执照# openssl req -new -key private/cakey.pem -x509 -out cacert.pemYou are about tobe asked to enter information that will be incorporatedinto yourcertificate request.What you are aboutto enter is what is called a Distinguished Name or a DN.There are quite afew fields but you can leave some blankFor some fieldsthere will be a default value,If you enter '.',the field will be left blank.-----Country Name (2letter code) :State or ProvinceName (full name) :Locality Name (eg,city) :Organization Name(eg, company) :OrganizationalUnit Name (eg, section) []:tecCommon Name (eg,your name or your server's hostname) []:rootca.netEmail Address []:# lltotal 28-rw-r--r-- 1 rootroot 1119 Aug 24 14:44 cacert.pemdrwxr-xr-x 2 rootroot 4096 Aug 23 22:14 certsdrwxr-xr-x 2 rootroot 4096 Aug 23 22:14 crl-rw-r--r-- 1 rootroot 0 Aug 23 22:14 index.txtdrwxr-xr-x 2 rootroot 4096 Aug 23 22:14 newcertsdrwx------ 2 rootroot 4096 Aug 23 22:20 private-rw-r--r-- 1 rootroot 2 Aug 23 22:15 serial我们的CA认证中心已经搭建好了,现在需要配置web服务器。http服务默认端口是80,其他额外功能的实现需要去添加模块,我们使用的https访问,使用的是443端口。查看系统是否已经安装实现https功能的模块# rpm -qa |grep mod_ssl*# 查询得知系统没有安装此模块由于mod_ssl模块的安装需要distcache软件包的支持,我们需要先安装distcache软件包。# rpm -ivh /mnt/cdrom/Server/distcache-1.4.5-14.1.i386.rpmwarning:/mnt/cdrom/Server/distcache-1.4.5-14.1.i386.rpm: Header V3 DSA signature:NOKEY, key ID 37017186Preparing... ########################################### 1:distcache ########################################### # rpm -ivh /mnt/cdrom/Server/mod_ssl-2.2.3-31.el5.i386.rpmwarning:/mnt/cdrom/Server/mod_ssl-2.2.3-31.el5.i386.rpm: Header V3 DSA signature:NOKEY, key ID 37017186Preparing... ########################################### 1:mod_ssl ###########################################我们的web服务器的https模块已经安装好了,现在需要产生web服务器私钥、证书请求文件以及证书。# mkdir -pv /etc/httpd/certs产生一个单独的目录存放web服mkdir: createddirectory `/etc/httpd/certs' 器的私钥、证书请求文件以及证书# cd /etc/httpd/certs/# lltotal 0# openssl genrsa 1024 >httpd.key 产生私钥Generating RSAprivate key, 1024 bit long modulus...++++++..........................................++++++e is 65537(0x10001)# chmod 600 httpd.key 修改私钥文件权限证书请求文件的产生# openssl req -new -key httpd.key -out httpd.reqYou are about tobe asked to enter information that will be incorporatedinto yourcertificate request.What you are aboutto enter is what is called a Distinguished Name or a DN.There are quite afew fields but you can leave some blankFor some fieldsthere will be a default value,If you enter '.',the field will be left blank.-----Country Name (2letter code) :State or ProvinceName (full name) :Locality Name (eg,city) :Organization Name(eg, company) :OrganizationalUnit Name (eg, section) []:tecCommon Name (eg,your name or your server's hostname) []:www.tec.comEmail Address []:
Please enter thefollowing 'extra' attributesto be sent withyour certificate requestA challengepassword []:An optionalcompany name []:使用证书请求文件请求CA中心颁发证书文件# openssl ca -in httpd.req -out httpd.certUsingconfiguration from /etc/pki/tls/openssl.cnfCheck that the requestmatches the signatureSignature okCertificateDetails: 证书相关信息 Serial Number: 1 (0x1) Validity Not Before: Aug 24 07:20:11 2013GMT Not After : Aug 24 07:20:11 2014GMT Subject: countryName = CN stateOrProvinceName = HeNan organizationName = zzdx organizationalUnitName = tec commonName = www.tec.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 43:FB:16:15:53:E8:75:66:01:89:27:7B:EA:5B:57:1A:F6:97:F0:BC X509v3 Authority Key Identifier: keyid:7E:12:A9:27:B8:F9:1B:C5:AD:88:AC:B0:92:C0:96:4F:36:BA:7E:1F
Certificate is tobe certified until Aug 24 07:20:11 2014 GMT (365 days)Sign thecertificate? :y 是否签发证书,当然是“y”
1 out of 1certificate requests certified, commit? yWrite out databasewith 1 new entriesData Base Updated 我们CA中心的数据库文件已经更新Web服务器与我们的证书捆绑root@localhost ~]#service httpd restart 重启httpd服务Stopping httpd: Startinghttpd: # netstat -tupln |grep httpd 查看httpd打开的端口tcp 0 0:::80 :::* LISTEN 4136/httpd tcp 0 0:::443 :::* LISTEN 4136/httpd https访问的443端口已经打开,我们可以使用https访问我们的web站点。由于我们客户端没有安装访问该网站的证书导致的,我们只需将配置文件中添加信任我们CA中心的证书就会解决问题。重启httpd服务,重新使用https访问我们的web站点。此时的证书错误是由站点名称与我们CA认证中心颁发证书的站点名称不同造成的,我可以可以重新请求CA中心颁发站点名称是192.168.30.100的证书,也可以通过DNS解析我们的站点名称,简单的话我们只需修改一下客户机的hosts文件就可以了。再次访问我们的web站点,输入我们的站点名称www.tec.com(此站点名称是CA证书颁发给站点的名称),证书各项验证通过,不会再出现证书错误的问题了。现在我们的web站点可以通过https加密的方式访问了,使用http的明文访问方式已经没有必要了,我们需要在httpd的配置文件将80端口给禁用掉,web站点就只能使用加密的https访问,不能使用明文的http访问。# service httpd restartStoppinghttpd: Startinghttpd: [ OK]# netstat -tupln |grep httpdtcp 0 0:::443 :::* LISTEN 4292/httpd此时我们再次使用http明文方式访问我们的站点将无法访问。上述内容就是我们通过身份验证、来源控制以及https加密访问三种方式来为windows平台和Linux平台的web站点提供安全。
避孕的效果:不成功,便成“人”。 我妈常说,我们家要是没有电话就不会这么穷。 生,容易。活,容易。生活,不容易。 帮你顶下哈!! 帮你顶下哈!! 男人与女人,终究也只是欲望的动物吧!真的可以因为爱而结合吗?对不起,我也不知道。。
页:
[1]