Linux安全

2020-03-20  本文已影响0人  Liang_JC

实验环境:

建立一个私有CA,为用户颁发证书

1、建立CA(server)
[root@CA CA]# cd /etc/pki/CA/
[root@CA CA]# (umask 077;openssl genrsa -out private/cakey.pem 4096)    #CA的私钥
[root@CA CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650  #CA证书
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GD
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:IT      
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:
[root@CA CA]# touch index.txt       #存放颁发的证书
[root@CA CA]# echo 01 > serial      #颁发证书的编号

2、申请证书(client)
[root@client CA]# cd /etc/pki/CA/
[root@client CA]# (umask 066;openssl genrsa -out app.key 1024)          #私钥
[root@client CA]# openssl req -new -key app.key -out app.csr            #用私钥生成申请证书文件
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GD
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:centos    
An optional company name []:
[root@client CA]# scp app.csr 192.168.139.100:/data

3、颁发CA(server)
[root@CA CA]# openssl ca -in /data/app.csr -out /etc/pki/CA/certs/app.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Mar  9 13:39:34 2020 GMT
            Not After : Mar  9 13:39:34 2021 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = GD
            organizationName          = magedu
            organizationalUnitName    = IT
            commonName                = ca.magedu.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                7C:29:7D:9C:D1:0C:2B:D6:BF:47:7B:00:55:49:9C:F6:B3:B5:D5:54
            X509v3 Authority Key Identifier: 
                keyid:C9:BE:A0:61:55:C8:49:0B:D3:AC:95:4F:6B:5F:76:92:6B:D9:88:78

Certificate is to be certified until Mar  9 13:39:34 2021 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@CA CA]# tree
.
├── cacert.pem                  #CA证书
├── certs
│   └── app.crt                 #申请的证书
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│   └── 01.pem                  #颁发的证书
├── private
│   └── cakey.pem
├── serial
└── serial.old

4 directories, 9 files
[root@CA CA]# openssl x509 -in cacert.pem -noout -text      #查看CA证书文件

吊销证书

#server
openssl ca -revoke newcerts/01.pem      #吊销证书
echo 01 > crlnumber                     #吊销证书编号
openssl ca -gencrl -out crl.pem         #吊销列表

基于KEY的ssh验证

#client生成密钥对
[root@client ~]# ssh-keygen                     #生成密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CYVWLR30rWBxUtMmvKPpisRkPjwcQMXs0E1ZfsvsTrI root@client
The key's randomart image is:
+---[RSA 2048]----+
|    .=.=+**++.   |
|   .. *.+.o=ooo  |
|    .+.  .+ o+.  |
|     ... o =oo   |
|      + S  o=.   |
|     B .  o.     |
|      O  .. o    |
|     . +  .=     |
|      . ..E .    |
+----[SHA256]-----+
[root@client ~]# ssh-copy-id root@192.168.139.100       #把公钥传给服务器
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.139.100's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.139.100'"
and check to make sure that only the key(s) you wanted were added.
[root@client ~]# ssh root@192.168.139.100
Enter passphrase for key '/root/.ssh/id_rsa': 
Last failed login: Mon Mar  9 22:33:37 CST 2020 from 192.168.139.107 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Mon Mar  9 21:14:46 2020 from 192.168.139.1
[root@CA ~]# 

基于KEY的ssh验证脚本

#!/bin/bash
PASS=centos
if [ ! -f /root/.ssh/id_rsa ];then
    ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa &> /dev/null && echo "ssh-key is created"
fi  
rpm -q expect &> /dev/null || yum install -y expect &> /dev/null
while read IP;do
expect <<EOF
set timeout 10
spawn ssh-copy-id -f -i /root/.ssh/id_rsa.pub root@$IP
expect {
    "yes/no" { send "yes\n";exp_continue}
    "password" { send "$PASS\n" }
}
EOF
echo $IP is ready
done < hosts.txt

rsync同步

#第一次全备份,第二次仅备份修改过的文件,注意拷贝文件最后需要加"/",不加"/"表示复制目录下的文件
[root@SRV-1 ~]# rsync -av /etc/ 192.168.139.101:/root/etc_srv-1
#测试
[root@SRV-1 ~]# touch /etc/passwd                   #改变passwd文件的时间戳
[root@SRV-1 ~]# rsync -av /etc/ 192.168.139.101:/root/etc_srv-1
sending incremental file list
passwd

sent 84,978 bytes  received 829 bytes  19,068.22 bytes/sec
total size is 31,884,689  speedup is 371.59

pssh轻量化管理

# 需要输密码
[root@Client ~]# pssh -H "root@192.168.139.100" -A hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 15:53:43 [SUCCESS] root@192.168.139.100

#基于key验证
[root@Client ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WgjO36Y/U6o2LgDyVWdrW8vTupK0gFkPUzTMxz6v+ww root@Client
The key's randomart image is:
+---[RSA 2048]----+
|       +o.       |
|      . *.o      |
|    .. + +       |
|o  o..+.o +      |
|.o .o+.=S+ =     |
|  o o..++ = o    |
|   .  ooo=E+     |
|    . ooB oo     |
|     +++.+o+o    |
+----[SHA256]-----+
[root@Client ~]# ssh-copy-id root@192.168.139.100
[root@Client ~]# pssh -h "/data/script/hosts.txt" -i hostname       #hosts.txt批量IP

#批量修改selinux策略
[root@Client ~]# pssh -h "/data/script/hosts.txt" -i "sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/sysconfig/selinux"
#输出结果重定向到指定目录
[root@Client ~]# pssh -h "/data/script/hosts.txt" -i -o /data/ hostname
# pscp复制本机文件到远程主机
[root@Client ~]# pscp.pssh -h host.txt /data/script/ssh-key.sh /data/
[root@Client ~]# pscp.pssh -h host.txt -r /data/script/ /data/
# pslurp复制远程主机文件到本机
pslurp -h host.txt -L /data /etc/passwd user    #远程主机的/etc/passwd复制到本机/data并改名为user

ssh 端口转发

环境:3台主机 
A:client 192.168.139.101
B:server 192.168.139.100
C: telnet-server 192.168.139.108

1、本地转发
  #A与C不能直接通讯,而A与B、B与C能通讯,实现A能telnet到C
    #C主机
    #centos6
    yum install telnet-server telnet -y
    vim /etc/xinetd.d/telnet
        disable = no
    service xinetd start
    iptables -A INPUT -s 192.168.1.101 -j REJECT
    
    #A主机
    #开启转发前
    [root@Client ~]# telnet 192.168.139.108
    Trying 192.168.139.108...
    telnet: connect to address 192.168.139.108: Connection refused
    #开启转发,利用B主机做跳板机
    [root@Client ~]# ssh -L 9527:192.168.139.108:23 192.168.139.100 -fN
    [root@Client ~]# ss -nt
    State       Recv-Q Send-Q                  Local Address:Port                                 Peer Address:Port              
    ESTAB       0      52                    192.168.139.101:22                                  192.168.139.1:52206              
    ESTAB       0      0                     192.168.139.101:36542                             192.168.139.100:22
    [root@Client ~]# telnet 127.0.0.1 9527
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    CentOS release 6.10 (Final)
    Kernel 2.6.32-754.el6.x86_64 on an x86_64
    centos6.localdomain login: liangjc
    Password: 
    Last login: Wed Mar 11 17:17:24 from 192.168.139.107
    [liangjc@centos6 ~]$ 
    
2、远程转发  
  #A与C不能直接通讯,而A与B、B与C能通讯,实现C能telnet到A
    
    #A主机
    yum install telnet-server telnet -y
    systemctl start telnet.scoket
    iptables -A INPUT -s 192.168.139.108 -j REJECT
    
    #B主机
    [root@SRV-1 ~]# ssh -R 9527:192.168.139.101:23 192.168.139.108 -fN
    [root@SRV-1 ~]# ss -nt
    State       Recv-Q Send-Q                  Local Address:Port                                 Peer Address:Port              
    ESTAB       0      0                     192.168.139.100:22                                  192.168.139.1:52187              
    ESTAB       0      0                     192.168.139.100:34156                             192.168.139.108:22 
    
    #C主机
    iptables -D INPUT -s 192.168.1.101 -j REJECT
    #开启转发前
    [root@centos6 ~]$ telnet 192.168.139.101
    Trying 192.168.139.101...
    telnet: connect to address 192.168.139.101: Connection refused
    [root@centos6 ~]$ telnet 127.0.0.1 9527
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    
    Kernel 3.10.0-957.el7.x86_64 on an x86_64
    񂫩ent login: LiangJC
    Password: 
    Last login: Tue Mar 10 17:55:45 from ::ffff:192.168.139.108
    [LiangJC@Client ~]$
    
3、动态转发
    #仅需要A、B共2台机器
    #B服务什么都不用配
    #A上操作
    [root@Client ~]# ssh -fND 9527 root@192.168.139.100
    [root@Client ~]# ss -nt
    State       Recv-Q Send-Q                  Local Address:Port                                 Peer Address:Port              
    ESTAB       0      52                    192.168.139.107:22                                  192.168.139.1:52206              
    ESTAB       0      0                     192.168.139.107:36548                             192.168.139.100:22
    [root@Client ~]# curl --socks5 127.0.0.1:9527 google.com
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>301 Moved</TITLE></HEAD><BODY>
    <H1>301 Moved</H1>
    The document has moved
    <A HREF="http://www.google.com/">here</A>.
    </BODY></HTML>
    [root@Client ~]#
    
killall ssh         #关闭所有隧道连接   

sshd服务器优化安全配置

vim /etc/ssh/sshd_config
#修改默认端口
    port 9527
#使用protocol version 2
    Protocol 2
#限制可登录用户
    AllowUsers LiangJC
#设定空闲会话超时时长
    LoginGraceTime 1m
#仅监听特定的IP地址
    ListenAddress 192.168.139.100   
#使用基于密钥的认证
    PasswordAuthentication yes
#禁止使用空密码
    PermitEmptyPasswords no
#禁止root用户直接登录
    PermitRootLogin no
#限制ssh的访问频度和并发在线数
    MaxStartups
#基于口令认证时,使用强密码策略    

AIDE 检查文件完整性

#安装aide
[root@Centos7 ~]# yum install aide
[root@Centos7 ~]# vim /etc/aide.conf        #指定对哪些目录和文件检查
    /etc/passwd         #用这个测试
[root@Centos7 ~]# aide --init               #初始化,生成数据库位置/var/lib/aide

#修改文件测试
[root@Centos7 ~]# chmod +x /etc/passwd
[root@Centos7 ~]# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz  #改名才能检测
[root@Centos7 ~]# aide --check
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2020-03-10 21:30:13

Summary:
  Total number of files:    162706
  Added files:          0
  Removed files:        0
  Changed files:        1


---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /etc/passwd

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------


File: /etc/passwd
 Perm     : -rw-r--r--                       , -rwxr-xr-x
 ACL      : old = A:
----
user::rw-
group::r--
other::r--
----
                  D: <NONE>
            new = A:
----
user::rwx
group::r-x
other::r-x
----
                  D: <NONE>

#修改后可以选择更新数据
aide --update

sudo

#安全隐患
vim /etc/sudoers.d/liangjc
liangjc ALL=(ALL) /bin/cat /var/log/messages*

sudo - liangjc
sudo /bin/cat /var/log/messages /etc/passwd /etc/shadow     #可以查看passwd,shadow

#解决方法
liangjc ALL=(ALL) /bin/cat /var/log/messages*,!/bin/cat /var/log/messages* *

TCP_Wrappers

#/etc/hosts.allow   优先级高
#/etc/hosts.deny

#仅允许192.168.139.0/24网段通过ssh连接
echo "sshd: 192.168.139." >> /etc/hosts.allow
echo "sshd: ALL" >> /etc/hosts.deny

pam_limits 资源限制

vim /etc/pam.d/system-auth      
    session required pam_limits.so      #查看是否被注释
vim /etc/security/limits.conf           #添加限制
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
上一篇下一篇

猜你喜欢

热点阅读