BIND编译安装
对于没有rpm包,需要源代码编译安装。
1、下载源代码:bind-9.12.2-P1.tar.gz,解压:tar -xf bind-9.12.2-P1.tar.gz
2、完善环境:
1)增加用户组named:groupadd -g 53 named
2)增加用户named(系统用户):useradd -r -u 53 -g named named
3、执行configure:进入加压后的目录,执行
./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --disable-ipv6 --disable-chroot --enable-threads
make
make install
4、编译安装后,没有配置文件,即没有named.conf和named.rfc1912.zones等配置文件;没有rndc相关的配置文件;所以需要手工建立。同时相关命令也不能直接调用,相关库文件、头文件、资料文件需要添加到搜索路径中,即导出这些文件:
1)导出二进制命令路径,需要将路径输出到PATH环境变量中:在/etc/profile.d/下建立named.sh文件,内容如下: export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH
然后重读一下文件:. /etc/profile.d/named.sh ,然后就可以直接调用这些命令了。
2)导出库文件,其他程序用到这些开发库,如果不导出,也无法使用,即找不到,所以要导出:
在/etc/ld.so.conf.d/下新建named.conf文件,内容是bind的库文件位置:
/usr/local/bind9/lib
然后要通知系统重读此配置文件,生成库文件搜索路径:ldconfig -v
3)导出头文件:ln -sv /usr/local/bind9/include/ /usr/include/named
4)导出帮助手册,即man目录,即将安装的man目录加入到搜索路径中,编辑/etc/man.config文件:添加MANPATH路径:
5)创建bind的配置文件/etc/named/named.conf,因为我们编译安装是配置了配置文件路径是/etc/named。
options {
directory "/var/named"; //全局配置只配置这一项就可以运行了,其他采用默认配置
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
然后这些库文件也需要我们自己创建:/var/named/named.ca、/var/named/localhost.zone、/var/named/named.local
根节点库文件,可以通过:dig -t NS . @ip获得,这里ip是可以连接互联网的机器:
将结果拷贝到named.ca中:dig -t NS . @192.168.138.2 > /var/named/named.ca
创建解析库文件:/var/named/localhost.zone:
$TTL 1d
@ IN SOA localhost. admin.localhost. (
2024052401
1h
5m
7d
1d )
IN NS localhost.
localhost. IN A 127.0.0.1
解析库文件:/var/named/named.local
$TTL 1d
@ IN SOA localhost. admin.localhost. (
2024052401
1h
5m
7d
1d )
IN NS localhost.
1 IN PTR localhost.
6)修改文件权限:
/var/named/下的所有文件:chmod 640 ./* ; chown :named *
chmod 640 /etc/named/named.conf ; chown :named /etc/named/named.conf
5、启动服务,成为缓存名称服务器:
named -u named -f -g -d 3,运行于前台
named -u named,运行于后台
启动过程中多次出现某目录或文件权限不够的提示,即permission denied,修改其属组权限后,系统运行正常
6、配置rndc,使用rndc工具时,提示
[root@study610-f2 named]# rndc reload
rndc: neither /etc/named/rndc.conf nor /etc/named/rndc.key was found
使用rndc-confgen产生:
按照提示分别拷贝相关内容到rndc.conf和named.conf中
# 以下为named.conf文件内容
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "mytestcc.com" IN {
type master;
file "mytestcc.com.zone";
allow-update { none; };
};
# Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
algorithm hmac-sha256;
secret "JS3jsXcMavvFVDGsjokYVhvml8h5dhwnvvrZJElW0F0=";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
# End of named.conf
# 以下为rndc.conf文件内容
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-sha256;
secret "JS3jsXcMavvFVDGsjokYVhvml8h5dhwnvvrZJElW0F0=";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
重新启动named进程,即可使用rndc进行管理。
远程登录:
登录到主机中,经历了 本地终端——>远程终端——>安全远程终端 几个阶段,最开始,主机提供相应的硬件接口,在此接口上连接VGA和键盘,实现登录主机,即本地终端登录,此时主机不需要额外的进程来处理与终端的通讯,随着网络的发展,出现在远端通过网络登录主机的需求,要实现的是同本地终端类似的功能,因为需要通过网络连接,并且要把网络包内容并在主机上解包并并运行其中的内容,就需要额外进程来负责,分为服务器端和客户端,服务器端实现接收客户端的输入内容,与主机交互将内容交给主机执行,将主机执行结果打包反馈给客户端,客户端要实现模拟本地终端的功能,实现内容输入和接收返回内容的展示,这需要双方遵守相同的规则,即需要终端通信协议,此时交互内容是明文在网络上传递;随着网络安全威胁越来越高,上述交互很容易被窃取,于是要求安全的网络交互,就出现了安全的远程终端,随之也就有安全终端协议。
Telnet:
一种不安全的远程终端协议telnet协议的实现,C/S架构,监听端口23/tcp。
telnet的使用:
1)安装:yum install telnet-server
安装后有telnet-server.x86_64 和telnet.x86_64 两个程序包,一个是服务器端程序包,一个是客户端程序包。telnet server是一个独特的服务,工作于基于超级守护进程管理的瞬时守护进程模式。
2)telnet server的启动:
chkconfig telnet on
service xinetd restart
查看:
xinetd叫超级守护进程,下面的没有运行级别的,像telnet叫瞬时守护进程。xinetd代瞬时守护进程监听,在有用户访问时,唤醒瞬时守护进程。像telnet进程使用的频度不高,不需要时刻监听。
3)登录,因为telnet是明文传输,禁止使用管理员账户登录,使用普通用户登录:
在windows上:
OpenSSH:
ssh:secure shell ,Protocol,即是一种协议。监听在tcp的22号端口,实现安全的远程登录。
OpenSSH:ssh协议的开源实现。dropbear是另一种实现。
Telnet:实现远程登录,但是没有安全保护,早期的远程登录。端口23/tcp
SSH协议版本:
v1:基于CRC-32做MAC,不安全:易遭到man-in-middle攻击
v2:双方主机协商选择安全的MAC方式。基于DH算法做密钥交换,基于RSA或DSA算法实现身份认证。
两种方式的用户登录认证: 基于password、基于key
通过ssh host登录服务器,客户端必须认证一下这台主机是不是就是要连接的那台主机,一般使用密钥对方式验证,客户端用主机的公钥解密主机发送的内容验证通过,即证明是需要的主机。关于客户端中主机的公钥,在第一次登录时,主机会发送这个公钥,在客户端会提醒是否保存这个公钥,就是让客户端使用者确定主机,接受保存后下一次访问,就会直接使用这个公钥。
基于密钥登录:客户端生成密钥对,将公钥发送给远程主机中对应登录用户的家目录下的某个文件中,以后此用户再登录时,主机用此公钥解密客户端的信息,依此来判断客户端的合法性,而不需要输入口令。此公钥是不允许公开的。
具体保存在~/.ssh/known_hosts中。
OpenSSH是C/S架构,客户端(C端)有ssh,(scp,sftp),windows客户端有xshell,putty,securecrt;对于Linux下的ssh客户端,配置文件为/etc/ssh/ssh_config;服务器端(S端):sshd,配置文件为/etc/ssh/sshd_config;
客户端工具:ssh命令
ssh [user]@host [command]:没有user,默认使用linux当前登录用户,指定了user,以指定的特定user登录。
ssh [ -l user ] host [command]:
参数 -p port:远程服务器监听的端口;
-X :支持X11转发
-Y:支持信任的x11转发;
客户端配置文件格式,/etc/ssh/ssh_config:
Host PATTERN
PARAMETER VALUE
# Host * # *号代表所有主机
# ForwardAgent no
# ForwardX11 no
# RhostsRSAAuthentication no
# RSAAuthentication yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask # 第一次登录时,会提示是否接受密钥,设置no不提问
# IdentityFile ~/.ssh/identity
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# Port 22
# Protocol 2,1
# Cipher 3des
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
Host *
GSSAPIAuthentication yes
# If this option is set to yes then remote X11 clients will have full access
# to the original X11 display. As virtually no X11 client supports the untrusted
# mode correctly we set this to yes.
ForwardX11Trusted yes
# Send locale-related environment variables
SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
SendEnv XMODIFIERS
基于密钥的认证(不需要密码进行登录):
(1)在客户端生成密钥对
ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"]
(2) 把公钥传输至远程服务器对应用户的家目录
ssh-copy-id [ -i [ identity_file] ] [ user@] machine
(3)登录验证:ssh
(4)安全提醒:不要使用root,可以登录后切换至root
实操:
1)客户端生成密钥对:
2)把公钥传输至远程服务器端对应用户的家目录
在服务器中查看:
注意,authorized_keys文件的权限为:-rw-------,即600,这是为了确保安全。
3)测试:
结果直接登录,没有提示输入密码。
scp命令:
scp [options] SRC ... DEST/
存在两种情形:
PULL:scp [options] [user@]host:/PATH/FROM/SOMEFILE /PATH/TO/SOMEWHERE
把远程文件拉到本地来,以哪个用户登录到哪台远程主机上去拉文件,即远程主机的用户
PUSH:scp [options] /PATH/FROM/SOMEFILE [user@]host:/PATH/TO/SOMEWHERE
把本地文件推送给(复制给)远程主机。也是远程主机用户。
常用选项:
-r :递归复制
-p :保持源文件的属性信息
-q :静默模式
-P PORT:指明remote host的监听的端口;
scp也基于ssh,因为在上一步设置了基于密钥的认证,所以复制过程也不需要输入密码。
sftp命令:
sftp [user@]host
同scp,也是基于ssh
服务器端:sshd
配置文件/etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.
# 以#加空格开头的是注释,以#开头后无空格的是配置项,去掉#就是配置
#Port 22 # sshd服务监听的端口,默认22
#AddressFamily any # IP家族,any表示IPv4和IPv6
#ListenAddress 0.0.0.0 # 监听本机所有IPv4地址
#ListenAddress ::
# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2 # 使用协议的哪个版本
# Centos6上sshd的配置
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
# 在7.x版本,即centos7上,配置如下
#HostKey /etc/ssh/ssh_host_rsa_key
##HostKey /etc/ssh/ssh_host_dsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key # 在用户登录时发送给用户的公钥,即保存在客户端用户家目录.ssh下know_hosts中的公钥
#HostKey /etc/ssh/ssh_host_ed25519_key
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h # 对称密钥重新生成时间间隔
#ServerKeyBits 1024
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV # 日志使用AUTHPRIV,保存在/var/log/secure
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m # 登录的宽限时间(等待输入用户密码时间)
#PermitRootLogin yes # 是否允许root直接登录,默认是可以的
#StrictModes yes # 是否严格检查格式
#MaxAuthTries 6 # 最大认证重试次数
#MaxSessions 10 # 最大会话数
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile .ssh/authorized_keys # 客户端采用密钥认证时,客户端的公钥在服务器端的保存位置
#AuthorizedKeysCommand none
#AuthorizedKeysCommandRunAs nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# 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 # 实现第三方统一认证的一种认证方式
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes
# GSSAPI options
#GSSAPIAuthentication no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
X11Forwarding yes # 允许客户端调用服务器端的图形程序
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes # DNS的反向解析功能,默认是开启的,一般设为no,否则,客户端登录时会发生被卡住一会的现象
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
# no default banner path
#Banner none
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server # 支持sftp
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand cvs server
在ssh命令中使用 -X选项支持X11转发或-Y选项支持信任的x11转发
ssh服务的最佳实践:
1、不要使用默认端口;
2、禁止使用Protocol version 1;
3、限制可登录用户:配置文件中AllowUsers和AllowGroups,白名单;
实操: 添加两个用户:gentoo和centos,在没配置白名单前都能登录:
在服务器的配置文件/etc/ssh/sshd_config的最后添加:AllowUsers root centos
然后重载服务:service sshd restart
再次测试登录,centos可以登录,但是gentoo无法登录:
也可以使用黑名单:DenyUsers
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、做好日志,经常分析;
ssh协议的另一个实现:dropbear
1)安装:yum install dropbear
2)生成密钥对,启动服务:
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
连接测试:
3)可以作为客户端连接其他远程主机,工具是dbclient
dbclient root@host
OpenSSL-重温:
三个组件:
openssl:多用途的命令行工具;
libcrypto:加密解密库;
libssl:ssl协议的实现
PKI:Public Key Instructure,公钥基础设施
CA、RA、CRL、证书存取库
建立私有CA(一个组织内部使用):两种方式
OpenCA和 openssl,OpenCA比较专业,使用也比较复杂;openssl简单易用
证书申请及签署步骤:
1)生成申请请求;
2)RA核验;
3)CA签署;
4)获取证书;
创建私有CA:
openssl的配置文件:/etc/pki/tls/openssl.cnf
安装上面配置信息创建对应的文件、目录
1)创建所需文件,在/etc/pki/CA目录下
# touch index.txt
# echo 01 > serial
确保certs 、crl、 newcerts、 private子目录存在
2)CA自签证书,要想生存证书,要有密钥对
# (umask 077;openssl genrsa -out private/cakey.pem 2048) # 生成私钥,-out与配置文件一致
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem # 自签证书生成
-new:生成新证书签署请求
-x509:专用于cA生成自签证书
-key:生成请求时用到的私钥文件,证书需要公钥,通过私钥自动生成
-days:证书有效期限
-out:证书的保存路径,与配置文件中的配置保持一致
这个文件发送给需要使用证书的客户机,导入到信任的根证书颁发机构中。
3)发证
(a)用到证书的主机生成证书请求
生成私钥、利用私钥生成证书签署请求文件
(b)把证书签署请求文件传输给CA
(c)CA签署证书,并将证书发还给用户
(d)查看证书中的信息:
openssl x509 in /PATH/FROM/CERT_FILE -noout -text| -subject | -serial
(e)吊销证书:
<1>获取要吊销的证书的serial
<2>CA先根据客户提交的serial与subject,对比检验是否与index.txt中信息一致;
吊销证书:openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
生成吊销证书的编号(第一次吊销一个证书时):echo 01 > /etc/pki/CA/crlnumber
更新证书吊销列表:openssl ca -gencrl -out thisca.crl
查看crl文件:openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
实操:
a)、 (umask 077; openssl genrsa -out httpd.key 2048) # 生成私钥
openssl req -new -key httpd.key -days 365 -out httpd.csr # 生成证书签署请求文件
b)、发送此请求文件至CA:
scp httpd.csr root@192.168.138.139:/tmp
c)、CA签发证书
openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
出现错误:
原因分析:在前面安装python时,对openssl进行了编译安装,所以现在的openssl使用的是编译安装后的高版本,其配置文件使用的是/usr/local/openssl/ssl目录下的openssl.cnf
错误排除:修改/usr/local/openssl/ssl/openssl.cnf配置文件,将其中的dir = ./demoCA,修改为dir=/etc/pki/CA应该就可以了。排查前面的操作,除了这个配置文件,其他都是在/etc/pki/CA目录下,所以openssl的配置文件只修改ca的目录配置即可。
再次签发:
证书签发成功。
生成的证书应该保存在/etc/pki/CA/certs下。
d)客户端取回证书:scp /tmp/httpd.crt root@192.168.138.138:/tmp
e)查看证书信息:
f)吊销证书:
至此,证书签发完毕。