Linux安全管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux安全管理相关的知识,希望对你有一定的参考价值。

安全


ssl 功能

    机密性 认证 完整性 重放保护


TLS协议工作在应用层的下层传输层的上层

TLS协议(也是大的协议集合)

    Handshake协议:协商 服务器身份验证 密钥交换

    ChangeCipherSpec协议:代表握手阶段已经完成 会发送消息通知

    Alert协议:警报 warning(警告) fatal(高度危险)

    Record协议:对消息认证和完整性保护 加密等

    HTTPS协议:和ssl/tls协议的组合


 https工作过程

    1 客户端发送hello消息给服务器

    2 服务器将CA签过名的私钥证书发送给客户端

    3 客户端拥有CA的公钥就可以解开CA签过名的私钥证书 从而得到服务器公钥

    4 客户端随机生成对称密钥 使用解密出来的服务器公钥加密再发送给服务器

    5 服务器收到后使用自己的私钥解密获取对称密钥

    6 双方都拥有了对称密钥就可以使用对称密钥加密


 支持ssl功能的Openssl

  openssl命令

  对称加密:

      工具:enc

      帮助:man enc

      openssl enc -e -des3 -a -salt -in fstab -out fstab.des3(将fstab文件使用对称秘钥进行加密)

      -a:使用base64编码

      -e:加密

      -des3:使用des3算法加密

      -in:输入文件

      -out:将加密后的文件生成为一个新的文件

      -salt:指定盐

      解密:

      openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab

      -d:解密

      -salt:指定盐(随机字符中第二个$到第三个$之间的值成为盐)


      生成文件hash值

      工具:dgst

      帮助:man dgst

      openssl dgst -md5[-hex] fstab(生成此文件的hash值)

      -hex:默认,16进制


      生成用户密码

      passwd

      -1:代表md5

      openssl passwd -1(生成密码的md5值)


      生成随机数

      帮助:man sslrand

      openssl rand -base64  10(随机生成10位的base64的字符)

      -base64位置可以替换不同的编码格式;当换成hex时那么每个字符为16进制,相当于4位二进制,出现的字符数要x2 



     

      生成私钥加密

      (umask 066;openssl genrsa -out test.key 2048)

      (umask 066;openssl genrsa -out test2.key -des3 4096)将生成的私钥文件使用对称算法加密

      -out:生成后的私钥文件名称

      2048:长度 可自行修改

      -des3:对称算法加密

      修改umask值 这样生成的文件默认权限就为600提高安全性 如果不在括号中执行后续创建的文件默认权限都会为600 括号的含义是在子shell中执行 不影响后续创建文件的操作

      解密被加密的私钥

      openssl rsa -in test2.key -out test2.key.out

      选项含义同上


      从私钥中提取公钥

      openssl rsa -in test.key -pubout -out test.key2.pub

      -in:从test.key文件

      -pubout:输出

      -out:到test.key2.pub

     

      生成随机数

      根据键盘和鼠标的操作生成随机数

      /dev/random:生成随机数的文件 并且需要操作鼠标和键盘才能生成随机数

      /dev/urandom:不停的生成随机数

      cat /dev/urandom | tr -dc '[:alnum:]' | head -c30 由于/dev/urandom中会不断的生成随机数 于是要使用"tr"取除了数字的所有随机数 并且取前30个字节




  CA的搭建

      建立私有CA:

        OpenCA

        openssl

      证书申请以及签署步骤:

        1 生成申请请求

        2 RA核验

        3 CA签署

        4 获取证书

  /etc/pki/tls/openssl.cnf     : openssl生成证书需要用到的配置文件

  1 创建所需要的文件

  touch /etc/pki/CA/index.txt 生成证书数据库文件

  echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号

  2 搭建CA

  生成私钥

  cd /etc/pki/CA/ #生成的私钥必须要在这个目录下 并且私钥名比喻为cakey.pem

  (umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 

生成自签名证书

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650

-new:生成新证书请求

-x509:用于自签证书

-key:生成请求时用到的私钥文件

-days 3650(以天为单位):证书的有限期限

-out:证书保存路径


操作完成后系统会提示输入一系列信息

国家:

省:

城市:

公司名:

部门:

网站名:*.域名(泛域名)比如*.tianmao.com

邮箱(可选):

文件生成

openssl x509 -in cacert.pem -noout -text #以文本方式查看自签证书


3 客户端申请证书

1 创建私钥

  (umask 066;openssl genrsa -out /app test.key 2048)

  /app:私钥存放位置

  test.key:私钥名称

2 申请证书

  openssl req -new -key test.key -out app.csr

操作完成后系统会提示输入信息

国家: 与上述相同

省:   与上述相同

城市:  可以不同

公司名: 与上述相同

部门: 可以不同

网站名:*.test.com(给这个网站颁发证书)

邮箱(可选):

3 将证书申请文件存放到CA服务器并检查申请信息

4 颁发证书

openssl ca -in app.csr -out certs/app.crt -days 730


  [ ca ]

  default_ca = CA_default    #默认使用的CA

  #unique_subject = no #是否允许申请两次

  [ CA_default ]

  dir = /etc/pki/CA #CA工作的主目录

  certs = $dir/certs #存放证书文件的位置

  crl_dir = $dir/crl #吊销证书列表

  database = $dir/index.txt #将证书信息添加到这个文件中

  new_certs_dir = $dir/new_certs #默认证书的路径



  certificate     =   $dir/cacert.pem #私钥存放位置

  serial = $dir/serial #证书的编号 存放的是下一个要颁发的证书的编号

  crlnumber = $dir/crlnumber #吊销证书的编号

  crl = $dir/crl.pem #


  default_days = 365 #证书有效期 默认365天

  default_md = sha256 #默认算法

  policy = policy_match 或者 policy_anything

  [ policy_match ]

  countryName = match        #两边国家必须相同

  stateOrProVinceName = match  #省份

  organizationName = match #地区名

  commonName = supplied #部门名

  [ policy_anything ]

  内容全为"optional" 也就是有些选项可以不同



Openssh

工具:

基于C/S结构

Client:ssh,scp,sftp,slogin

Windows客户端:

xshell,putty,securecrt,sshsecureshellclient

Server:sshd


ssh客户端

ssh配置文件:/etc/ssh/ssh_config

     .ssh文件中存放的是登录过的主机的公钥,也就是已知主机,下次登录不会提示yes or no;known_hosts文件中的内容与登录过主机下的/etc/ssh/ssh_host_rsa_key.pub内容相同

格式:ssh [[email protected]]host [command] 

例子:ssh [email protected] who 在目标主机上执行who命令

-p port:指定服务器端端口号 默认为22;"可在/etc/ssh/ssh_config中修改Port这一行的端口号 对正在连接的用户不起作用"

-b:指定连接的源IP;"当发起端IP不止一个的时候并且想刻意使用某一个ip去连接就使用此选项"

-v:显示连接的详细过程

-C:压缩;可使数据包变小

-X:支持x11转发;"可以在目标主机上启用图形化的功能"

-t:A-->B-->C当C禁止A连接则A可以使用ssh -t "B的IP" ssh "C的IP"


ssh服务登录验证

基于用户名口令验证

1 客户端发起ssh请求,服务器会把自己的公钥发送给客户端

2 用户会根据服务器发来的公钥对密码进行加密

3 加密后传给服务器,服务器使用自己的私钥解密,密码正确,登录成功

/etc/ssh中存放了许多公钥与私钥".pub"后缀的为公钥


基于密钥的验证方法

1 在客户端生成一对儿密钥,将公钥复制给服务器端并且在服务器端自动存放到authorized_keys

2 客户端发起连接请求,服务器端收到后会在存放公钥的位置查,如果有对应的主机和用户信息,会生成随机字符串 将字符串使用客户端的公钥进行加密传送给客户端

3 客户端收到后使用私钥解密查看字符串是否相等,相等的话传送给服务器端查看是否相等,相等就可以进行互相

实现基于密钥的验证方法:

1在客户端生成秘钥对

ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"] 中括号内可不指定

-P:给秘钥加口令

-t:指定算法;默认为rsa算法

-f:指定生成的文件存放的位置;默认就为用户家目录下的/.ssh/id_rsa下

2 把公钥文件传输到服务端对应用户的家目录

ssh-copy-id -i id_rsa.pub [email protected]"对方IP地址"

3 再次登录可以不用输入用户名密码直接登录

转换不正确的公钥格式

ssh-keygen -i -f "公钥文件名称"

###给生成好的密钥添加口令:ssh-keygen -p 再次登录需要输入私钥的密码

   将私钥的密码交给代理程序,这样以后连接也不用输入私钥的密码,但关闭终端连接后代理也会停止,每次连接要启动一下代理

     1 启动代理程序

      ssh-agent bash

     2 将私钥口令用它代理

      ssh-add

     要添加新的基于密钥的验证的话;将客户端公钥发送到被连接主机并且将内容追加到 authorized_keys中即可


解决ssh连接过慢

  修改服务器端的/etc/ssh/sshd_config中的UseDNS no以及GSSAPIAuthentication no


sshd服务的配置文件,两个文件都存放在/etc/ssh目录下

  ssh_config:客户端配置文件

  Port:默认连接端口  -p可以指定端口号

  StrictHostKeyChecking ask:管理第一次连接是否提示yes or no,不启用的话讲ask改为no



scp命令:

scp [options]源...目标/

两种方式:

scp [options] [[email protected]]host:/sourcefile /目标路径

scp [options] /sourcefile [[email protected]]host:/目标路径

[options]:

-q:静默模式

-r:递归复制

-C:压缩

-p:保持源文件的属性

-P:指定端口


rsync

rsync [options] "文件名" "目标IP:/目标目录路径"

比scp更快,只复制发生变化的文件

注意:如果要复制整个目录就不要在目录最后加"/" 加了/的话就把整个目录复制过去

选项:

-n 模拟复制过程

-v 显示详细过程

-r 递归复制目录

-p 保留权限

-t 保留时间戳

-g 保留组信息

-o 保留所有者信息

-l 将软链接文件本身进行复制(默认)

-L 将软链接文件指向的文件复制

-a 保留源文件所有属性


sftp命令

sftp "目标IP地址"

基于ssh协议的ftp

带!的命令是在本地执行

get:下载

put:上传

?:查看帮助


pssh工具(适用于小型环境)

语法:pssh [options] [[email protected]]hostip command

pssh存放在epel源中

注意:执行命令中如果存在星号 $符号的时候需要用单引号将命令引起来才能实现在目标主机上操作

-H:指定对方的IP地址 后方可以跟多个主机IP地址双引号引起来 用空格隔开

-i:将结果输出

-h:读取文件中数据 可将多个主机ip地址写入到文件中 使用-h读取文件数据

-o:将输出结果生成文件单独放在指定目录中 以ip地址为文件名


pscp.pssh将本地文件批量复制到远程主机(要在基于密钥验证的前提下才能使用)

语法:pscp.pssh [options] [本地文件or目录] [目标主机文件or目录]

-h:读取文件中数据 可将多个主机ip地址写入到文件中 使用-h读取文件数据

-v:显示复制过程

-a:保留所有常规属性

-r:递归复制目录

-H:指定目标主机ip地址

将目标主机文件拉取到本机

pslurp -h ip.txt -L /app /var/log/secure remote_secure

-L:指定本地目录

remote_secure:复制到本地/app目录下并且改名


ssh的端口转发

例子:

从外部向内部

C是telnet服务器

B是ssh服务器

A是ssh telnet客户端

在A主机上进行操作

  当A想通过telnet访问C的时候过程可能不安全,所以可以使用ssh进行端口转发,建立隧道,使用ssh协议封装telnet 访问,过程相对安全

A主机端口随机

1 建立隧道

ssh -L A主机端口:C telnet主机IP:C主机的telnet端口  B主机的IP -Nf

    -N:不登录目标shell

    -f:后台运行

2 telnet 127.0.0.1 端口 此时建立成功 但在C服务器上认为的是B主机在访问


从内部向外部

A为ssh服务器

B为ssh客户端

C为smtp服务器

在B主机上进行操作

1 ssl -R A主机sshd服务的端口:C主机IP:C主机的smtp端口 A主机的IP -Nf

2 telnet 127.0.0.1 端口


动态端口转发:

例子:

A为国内服务器

B为中间服务器

C为google服务器

1 在C服务器上搭建httpd服务

yum -y install httpd

2 在C服务器上设置防火墙策略禁止A访问

iptables -A INPUT -s A主机IP -j REJECT

3 在A服务器上执行;A与B服务器建立了ssh连接;在A服务器上的浏览器中进行代理设置;

ssh -D "随机本地端口" B服务器IP地址 -N

4 测试

curl --socks5 127.0.0.1:A上的随机端口 http://C主机IP地址


ssh服务器:

服务器端:sshd

配置文件:/etc/ssh/sshd_config

# Port:端口;

# AddressFamily any:支持的ip格式,ipv4 ipv6默认都支持;

# ListenAddress:默认监听的IP地址是任意的,后方对应的ip就是对外可连接的ip地址;

# HostKey:对应的私钥;

# LoginGraceTime 2m:登录最长时间;

# PermitRootLogin:禁止root用户连接,默认是可以的;

# StrictModes:检查.ssh/目录下的权限;权限不正确拒绝连接;

# MaxAuthTries 6:默认最多错误输入3次;设置的值的一半;

# MaxSessions 10:在一个连接的情况下最多建立多少个会话,针对克隆连接;

# PubkeyAuthentication yes:是否支持基于密钥的连接

# PasswordAuthentication yes:是否支持用户名密码的连接;一般都是禁用此项使用基于密钥的连接

# PermitEmptyPasswords:是否允许空口令

# GatewayPorts no:是否充当网关

# ClientAliveInterval:多久发送检查,检查如果没有任何操作就断开;默认为永久不断开

# ClientAliveCountMax:最多发送几个检查

# UseDNS:将DNS反向解析改为no可提升速度

# GSSAPIAuthentication:改为no提升连接速度

# MaxStartups:用户没有输入密码的连接数,达到10个以上会拒绝没有验证的用户,以30%的比例拒绝,当10-100的时候比例增长,并发最多达到100个;

# Banner:连接上目标主机之后的提示信息(写在一个独立的文件中,sshd_config配置文件中Banner后写的是文件的绝对路径)

限制可登录用户的方法:

/var/log/secure中可查看到sshd的日志

# 手动添加Allowusers "用户名" 没有写的所有用户都不可以连接,包括root

# 手动添加Denyusers  "用户名" 拒绝指定用户连接 当Allowusers和Denyusers都有同一个用户时,拒绝优先

# Allowgroups "组名"  写的组可以连接

# Denygroups  "组名" 写的组都拒绝连接;


AIDE:文件完整性检查和入侵检查

安装:yum -y install aide

aide.conf为配置文件

CONTENT_EX在配置文件中定义了关心哪几个位置

# /boot/ CONTENT_EX:对boot这个目录进行所有权限的记录

........等多个目录相同含义

也可以自定义关键字,方便后期要监控的目录进行引用

# CUSTOM = p+u+g+s+sha256+m+acl

# /app CUSTOM      #监控app目录下的CUSTOM后方对应的属性,一系列属性在配置文件中有解释

# !/app/f3 #加!的意思是不关心app目录下的f3文件

# aide --update    #更新数据库中的信息

# aide --init #生成新的数据库中的信息

新的生成的aide.db.new.gz文件要改为aide.db.gz才能进行比对

# aide --check #比对数据库中的信息和当前被监控的目录的信息

/var/log/aide为日志文件路径


更改身份

su 切换身份: su -l username -c 'command'

使用用户登录并且执行后面的命令


sudo

-u:指定要代表的用户

-V:查看版本配置信息

-l,ll:列出用户在主机上可用和禁用的命令

-k:清除时间戳,下次使用sudo需要输入密码

-v:将密码有效期延长

-K:删除时间戳文件

-b:在后台执行指令

-p:改变输入密码的提示符

/etc/sudoers:在此文件中授权

可使用visudo拥有语法检查功能,如果有问题,保存退出会提示

格式:username 登录主机=(以哪个用户的身份) 要执行的命令;多条命令以逗号作为分隔符,需要些绝对路径

登录主机:写哪一个IP就只能在哪台主机上进行sudo操作,可以写多个地址或网段

例子:

1 fang ALL=(root) /usr/bin/mount /dev/cdrom /media       #使fang用户以root用户使用挂载命令

如果想要用户可以任意挂载到任何位置将/dev/cdrom /media等去掉只写命令的绝对路径即可

2 如果想要单个用户使用单个配置文件则可以在/etc/sudoers.d下创建文件即可

例子:

vim /etc/sudoers.d/fang #创建新文件

fang ALL=(root) /usr/bin/mount,/usr/bin/umount,/usr/bin/cat /etc/shadow #文件中的格式


3 /etc/sudoers中%开头的就是对组的配置

%wheel ALL=(ALL) ALL #wheel组默认存在将用户加入到此组中就附带ALL权限

usermod -G wheel fang #fang用户拥有wheel组的所有权限


例子2:

如果希望普通用户可以查看/var/log/secure-`date +%F`的日志信息按以下方式写

vim /etc/sudoers.d/fang

fang ALL=(root) /usr/bin/cat /var/log/secure*,!/usr/bin/cat /var/log/secure* *      #既防止了用户访问别的文件也赋予了正确权限


sudo在配置文件中,还支持通配符的使用

sudo别名和实例

用户:user

以哪个用户身份运行:runas

通过哪些主机:host

运行的命令:command

别名拥有四种类型:

USER_Alias

Runas_Alias

Host_Alias

Cmnd_Alias

别名格式

别名名称要为大写在,多个命令使用逗号隔开

User_Alias "别名名称" = "包括的用户名"

Cmnd_Alias "命令别名" = "命令的绝对路径"

用户别名名称 ALL=(root) 命令别名名称


TCP_Wrappers守护进程

工作在传输层的TCP协议

判断服务是否能够由tcp_wrapper进行访问控制的方法:

ldd "程序的绝对路径" (libwarp.so)

配置文件:/etc/hosts.allow,/etc/hosts.deny

当hosts.allow文件中没有匹配条件的时候才去查看hosts.deny文件

格式:

/etc/host.deny,修改完整后即时生效

"进程名称","第二个进程名称":"要拒绝的ip地址" 空格隔开多个IP

当两个文件都没有定义的话默认是允许连接的

例子:

in.telnetd,[email protected]:ALL(拒绝所有通过telnet以及ssh访问172.18.0.6的ip地址)

sshd:192.168.27. EXCEPT 192.168.27.7(拒绝所有27网段的ip,仅允许192.168.27.7访问,要在allow文件中写27.7的地址,也可以在deny中如此定义)

EXCEPT:排除后方的ip或网端

sshd:192.168.27. :spawn echo `date +%%F` client  login > /app/tcp_warppers.log(记录27网段登录后会将echo后面的信息输入到文件中)

spawn:开启一个进程

%c:客户端信息

%s:服务器信息

%u:用户

twist:当客户端连接到服务端的时候执行twist后方定义的操作,而服务不做响应

sshd:192.168.27. :twist /bin/echo "Deny access Server sshd 403" (当27网段的客户端来通过sshd连接到服务端的时候不会响应并且回回复twist后方信息)


PAM:可插入的认证模块

认证库:文本文件(/etc/passw;/etc/shadow),MySQL,NIS,LDAP

远程登录,本地登录

PAM相关文件

模块文件目录:/lib64/security/*.so

环境相关配置:/etc/security/(有些模块比较简单没有配置文件,比较复杂的就拥有配置文件在此处,模块在上方目录)

主配置文件:/etc/pam.conf;默认不存在

为每种应用模块提供一个专用的配置文件:/etc/pam.d/应用名称,格式与主配置文件基本相同,文件中主要描述是如何调用/lib64/security/*.so文件

注意:如果/etc/pam.d存在,那么/etc/pam.conf文件将会失效


PAM模块认证过程:

Service(服务)→PAM(配置文件)→pam_*.so

PAM首先确定一项服务,然后加载相应的PAM的配置文件(/etc/pam.d/*.conf),然后通过配置文件查看调用某一个模块以及认证过程


通用配置文件/etc/pam.conf格式

application type control module-path arguments     #不常用

专用配置文件/etc/pam.d/*格式

type control module-path arguments


type(类型): Auth(验证账号是否合法)

Account(判断账号是否可登陆)

Password(在用户修改密码的时候做复杂检查)

Session(用户在使用服务之前或使用服务之后附带的一系列信息;比如在用户登陆后是否要记录日志)

        -Auth|Account|Password|Session:(对应模块没有安装的话不会记录到日志,不会报错)

control(控制):PAM如何处理模块的成功或失败情况

required:一票否决,还会继续检查,但总体来说已经失败,下面有通过也没用;本模块必须成功不代表一定成功,但是不一定一定成功,因为后方还有检测

requisite:一票否决,如果失败就直接失败,不会继续向下检查

sufficient:一票通过,如果返回通过,则通过,后面就不用看了

optional:结果忽略,不影响结果

include:指定后方模块是调用

module-path(模块路径):默认就去/lib64/security下查找

arguments(参数):传递给模块的参数


例子1 :

模块:pam_shells.so

说明:检查登录有效shell

ssh服务没有调用此项模块,所以对sshd无效,编辑/etc/pam.d/sshd在其中添加

auth required pam_shells.so    #当ssh连接的用户使用的shell不在/etc/shells中就会拒绝连接


例子2 :

模块:pam_securetty.so

说明:如果用户登录的是安全的tty(/etc/securetty)则允许root登录,否则不允许root登录,不针对其他用户

telnet默认就是不允许root登录

remote中调用了pam_securetty.so模块,就是所有远程连接如果不是安全的tty都不可以登录;包括telnet,在/etc/securetty中添加tty即可登录


例子3 :

模块:pam_nologin.so

说明:man pam_nologin

当/etc/nologin存在的时候,拒绝用户的登录,并且文件内容将显示在登录提示位置,对root用户不影响

touch /etc/nologin          #创建/etc/nologin文件

vim /etc/pam.d/su  auth  required pam_nologin.so #编辑/etc/pam.d/su添加auth required pam_nologin.so

这样使用su切换用户的时候也是不可以的,默认是可以的


例子4 :

模块:pam_limits.so

说明:限制用户系统资源使用,对root也有影响

ulimit:限制资源,包括shell以及进程创建

-a:显示当前所有ulimit限制

   open files:最多打开的文件个数,默认为1024;每发起一个连接就会打开一个sockets文件

       -n:修改最多打开文件个数,最大接收的并发连接数(普通用户只能调小不能调大)

    cpu time:每运行一个程序使用的cpu的时间

    max user processes:最大用户的进程数,最多这么多进程

配置文件:/etc/security/limits.conf

   -:包括软硬限制都做了限制

   nproc:最大进程数

比如"fang"这个用户最大打开10个进程就使用以下格式

# fang - nproc 10    #如果用户名部分写组名的话则要加上@符号

 

  ab -c 10 -n 200 http://IP/

    -c:并行发起10个链接

    -n:总链接数200个



以上是关于Linux安全管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux用户管理Linux用户管理

笔记防线-企业linux安全:企业Linux安全系统防护-(未完)

Linux系统管理

Linux用户管理Linux文件管理

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

Linux磁盘管理的Linux管理命令