6.操作系统操作与安全加固
6.1.linux操作系统基础
- Linux的介绍
Linux是一个可以自由发布的类UNIX内核实现,它是一个操作系统的底层核心。Linux是由芬兰赫尔辛基大学的Linus开发,期间得到了网上广大UNIX程序员的帮助。它最初是受其教授的Minix(一个小型的类UNIX系统)启发而开发的程序,纯属个人的爱好,但是后来它自身逐步发展成为一个完整的系统。
要理解什么是Linux,首先要了解在Linux之前诞生的系统和应用程序——UNIX和GNU软件。
- Linux目录结构
bin -> usr/bin | Binaries (二进制文件) 的缩写, 这个目录存放系统用户常使用的命令 |
---|---|
/boot | 存放着启动Linux时使用的一些核心文件,包括一些连接和镜像文件 |
/dev | dev 是 Device(设备) 的缩写, 存放的是 Linux 的外部设备 |
/etc | etc 是 Etcetera(等等) 的缩写,存放所有的系统管理所需要的配置文件和子目录 |
/home | 用户主目录,每个用户都有自己的目录,一般用户目录名是以用户的账号命名 |
/lib、/lib64 | lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库 |
/lost+found | 该目录一般情况下是空的,当系统非法关机后,就会存放一些文件 |
/media | linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下 |
/mnt | 让用户临时挂载别的文件系统,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容 |
/opt | opt是optional(可选)的缩写,给主机额外安装软件的目录 |
/proc | 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息【注意:该目录的内容不在硬盘上,在内存中】 |
/root | 该目录为系统管理员,也称作超级权限者的用户主目录 |
/run | 是一个临时文件系统,存储系统启动以来的信息; 当系统重启时,这个目录下的文件应该被删掉或清除 |
/sbin -> usr/sbin | 存放着超级用户root常使用的命令 |
/srv | 存放一些服务启动之后需要提取的数据 |
/tmp | tmp 是 temporary(临时) 的缩写,存放一些临时文件的 |
/usr | usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下 |
/var | var 是 variable(变量) 的缩写,存放着在不断扩充着的东西,将那些经常被修改的文件 放在这个目录下,包括各种日志文件 |
6.1.1.linux的基础操作
#查看主机名
hostname
#列出文件列表
ls (-a -l - h)
#复制文件
cp
#进入文件夹目录
cd (.. . ~ - 目录名)
#创建文本文件
touch test.txt
#创建文件夹
mkdir
#挂载光驱
mount 挂载源 /挂载点
#卸载光驱
umount 挂载源 /挂载点
#移动文件
mv
#服务管理(停止与启动)
systemctl start (服务名) (restart,stop,start,enable)
#(删除文件)
rm
#查看网络当前配置
ip add show ifconfig
#清楚当前窗口
clear
#关机命令
poweroff/shutdown/init 0
#查看所有系统的登录记录
last
#查看命令的帮助
man ls/vim/ ls/vim --help
#查看文本的前N行数据
head -n
#查看文本的后N行数据
tail -n
#查看系统版本信息
uname -a
cat /etc/os-release
#grub状态下恢复密码
在Linux16后面加上 'init=/bin/bash console=tty0'
#强制杀死异常进程
kill [参数] [进程PID]
kill -9 1234
6.2.linux的命令
6.2.1.进阶命令
#普通用户下更改root密码
sudo passwd root
#编辑软件源列表(换源)
vim /etc/apt/sources.list
#更新系统的包索引和包的列表
apt update
#将软件包升级到最新版本
apt upgrade
#安装 ssh服务
apt install openssh-server
#更改SSH服务配置信息(可解决安装完后无法ROOT登录问题)
vim /etc/ssh/sshd_config
#重启sshd服务(status,enable,start,stop,restart)
systemctl restart ssh.service
#打包文件(c:生成档案文件,X解开打包文件,v:列出归档解档的详细过程,f:指定档案文件名称)
tar -xvf 打包文件.tar 被打包的文件路径
#安装和XSHELL传输文件的软件(一款代替FTP的软件)
apt install lrzsz
#lrzsz的用法
#上传文件
rz -y
#下载文件
sz 文件名
#让列表文件以M的单位来显示
ls -lh
#显示目录所有文件系统的可用空间以及使用情形,并用Gb,mb显示
df -h
#查看当前目录的大小
du -shntu的基础操作
#查看当前用户的环境变量
echo $PATH
#更改文件的用户组,更改某个目录或文件的用户名和用户组的, -R是递归修改权限(更改整个文件夹)
chown 用户名:组名 文件路径
#chmod用法,修改某个目录或文件的访问权限。
chmod u+w 文件名 chmod 777 文件名
6.2.2.其他一些常用命令
- alias命令,设置命令的别名输入方式,简化太长的命令
- 直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢?,使用编辑器打开
~/.bashrc
,在文件中加入别名设置,如:alias rm=‘rm -i’,保存后执行source ~/.bashrc
,这样就可以永久保存命令的别名了。
6.3.linux用户和用户组相关概念
6.3.1.用户的基础
-
Linux是一个真实的、完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响。
-
不同用户具有不同的权限,每个用户是在权限允许的范围内完成不同的任务,linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
6.3.2.用户的简介
- 每次登录后的权限会根据用户的身份来确定
- 每个进程在执行时,也会有其用户,该用户也和进程所能控制的资源有关,如Mysql用户之类的
- 每个用户都有自己的UID,每个用户组也有自己的组ID称为GID,并且这两个码是不可重复的。
- 普通用户只能由root用户创建,该用户拥有家目录,并且可以登录。
6.3.3.用户和用户组的配置文件
- /etc/passwd
在配置中以冒号分隔各个模块之间的信息从左到右依次是
用户名 | 登录密码 (以X代替) | UID | GID | 组名 | 家目录 | shell环境
- /etc/shadow #存储者用户的密码信息
- /etc/login.defs #该文件可以设置密码过期时间,密码最大长度限制等内容
- /etc/group #存储用户组的信息
6.3.4.Linux用户和用户组管理相关命令
useradd 用于添加用户
- 用法:useradd [选项] 用户名
-M | 表示不创建家目录 |
---|---|
-d | 指定用户的主家目录,必须是绝对路径 |
-s | 表示指定用户的shell环境 |
-u | 表示指定用户的uid |
-g | 表示指定用户的gid(需要指定的gid存在) |
-p | 指定用户的密码(必须以密文的方式指定)存在) |
-G | 表示指定用户的附属组(需要指定的gid |
-e | 指定账户的失效日期,格式为YYYY-MM-DD |
-f | 密码到期后的宽限天数,0表示立即失效,。-1为永不失效 |
#实例操作,创建用户fjl 并且指定家目录为根目录下的123文件夹内,并且该账户将于2023-11-12日失效
root@wgs:~# useradd fjl -d /123 -e 2023-11-12
-
usermod 修改用户的信息
-
用法:usermod [选项] 用户名
-d | 修改用户主目录 |
---|---|
-e | 修改账号的有效期限 |
-f | 修改在密码过期后多少天即关闭该账号 |
-g | 修改用户所属的组 |
-l | 修改用户账号名称 |
-u | 修改用户ID |
-L | 修改用户密码,使密码无效 |
-U | 解除密码锁定 |
#实例操作,修改用户fjl01m密码过期10天后关闭该账号
#usermod -d 目录 已有的用户名 # 更改已有用户的家
-
userdel 删除用户
-
用法:userdel [选项] 用户名
-r | 将用户的主目录一起删除 |
---|
gourpadd 用指定的组名称来建立新的组账号
- 用法:gourpadd [选项] 用户名
-g | 指定ID(gid)号,除非使用-o选项,否则该值必须唯一(组ID必须有) |
---|---|
-f | 强制执行,创建相同的id组 |
-o | 允许设置相同组id的群组,id可不唯一 |
gourpmod 更改群组属性
- gourpmod [选项] 组名
-g | 指定组ID(gid) |
---|---|
-n | 修改用户组名 |
gourpdel 删除用户组
gpasswd 管理用户组
passwd
#更改用户密码
-k, --keep-tokens 更新只能发送在过期之后
-d, --delete 删除密码(root only)
-l, --lock 停止账号使用(root only)
-u, --unlock 启用已被停止的账户(root only)
-e, --expire 强迫用户下次登录时必须修改口令(root only)
-f, --force 强制执行
-x, --maximum=DAYS 指定口令最长存活期(root only)
-n, --minimum=DAYS 指定口令最短存活期(root only)
-w, --warning=DAYS 口令要到期提前警告的天数(root only)
-i, --inactive=DAYS 口令过期后多少天停用账户(root only)
-S, --status 显示密码信息(root only)
#以下例子(7天内不允许修改,90天内必须修改,)
passwd -n 7 -x 90 -w 7 fjl
chage [选项] 用户名
- 也可以直接输入chage 用户名,按照提示进行修改
6.3.5.其他用户和用户组以及密码相关常用命令
- id 用户名 # 用户的信息
- groups 用户名 # 用户的组信息
- su - 用户名 #切换用户(用户的环境变量也会切换)
- su 用户名 #切换用户(用户的环境变量不会切换,不要使用)
6.4.加固以及安全排查
6.4.1.账号安全方面
#1)基本使用
1、用户信息文件 /etc/passwd
root:x:0:0:root:/root:/bin/bash
account:password:UID:GID:GECOS:directory:shell
用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后的 shell
注意:无密码只允许本机登陆,远程不允许登陆
2、影子文件 /etc/shadow
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
#2)入侵排查
1、查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
2、查询可以远程登录的帐号信息
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
3、除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
4、禁用或删除多余及可疑的帐号
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user 删除 user 用户
userdel -r user 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
6.4.2.历史命令
通过 .bash_history 文件查看帐号执行过的系统命令
'1)'root 用户的历史命令
history
'2)'普通账号的历史命令(在/home下的各自账号目录下的.bash_history)
cat ./bash_history
6.4.3.检查异常端口
使用netstat 网络连接命令,分析可以端口
netstat -antlp | more
6.4.4.检查异常进程
使用ps命令,分析进程
ps aux | grep pid
6.4.5.常见信息排查
- 查看最近登录信息
last
- 查看当前登录用户
who
- 通信状态查看
netstat -anptu #查看端口连接情况
netstat -anptu | more #翻页查看
netstat -antpu | grep 127.0.0.1 #筛选关键字
- 查看开机启动服务以及已有的服务
#查看已有的服务,并进行筛选
service --status-all | grep ssh
#查看启动脚本
ls /etc/init.d/
-
查看计划任务
- 基本命令
crontab -l #列出某个用户cron服务的详细内容 Tips:默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root crontab -r #删除每个用户cront任务(谨慎:删除所有的计划任务) crontab -e #使用编辑器编辑当前的crontab文件 如:*/1 * * * * echo "hello world" >> /tmp/test.txt #每分钟写入文件
6.4.5.网络抓包分析
- tcpdump详细信息
tcpdump命令选项
◇ -a #将网络地址和广播地址转变成名字
◇ -A #以ASCII格式打印出所有分组,并将链路层的头最小化
◇ -b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
◇ -c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump
◇ -d #将匹配信息包的代码以人们能够理解的汇编格式输出
◇ -dd #将匹配信息包的代码以c语言程序段的格式输出
◇ -ddd #将匹配信息包的代码以十进制的形式输出
◇ -D #打印系统中所有可以监控的网络接口
◇ -e #在输出行打印出数据链路层的头部信息
◇ -f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
◇ -F #从指定的文件中读取表达式,忽略其他的表达式
◇ -i #指定监听网络接口
◇ -l #使标准输出变为缓冲形式,可以数据导出到文件
◇ -L #列出网络接口已知的数据链路
◇ -n #不把网络地址转换为名字
◇ -N 不输出主机名中的域名部分,例如www.baidu.com只输出www
◇ -nn #不进行端口名称的转换
◇ -P #不将网络接口设置为混杂模式
◇ -q #快速输出,即只输出较少的协议信息
◇ -r #从指定的文件中读取数据,一般是-w保存的文件
◇ -w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
◇ -s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
◇ -S #将tcp的序列号以绝对值形式输出,而不是相对值
◇ -T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
◇ -t #在输出的每一行不打印时间戳
◇ -tt #在每一行中输出非格式化的时间戳
◇ -ttt #输出本行和前面以后之间的时间差
◇ -tttt #在每一行中输出data处理的默认格式的时间戳
◇ -u #输出未解码的NFS句柄
◇ -v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
◇ -vv#输出相信的保报文信息
- tcpdump的表达式
◇ 表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获,在表达式中一般如下几种类型的关键字:
a):关于数据类型的关键字:
包括host、port、net,例如host 192.168.38.7表示这是一台主机,net 192.168.38.0表示这是一个网络地址,port 22指明端口号是22,如果没有指明类型,则默认的类型是host。
b):数据传输方向的关键字:
包括src、dst、dst or src、dst and src,这些关键字指明了传输的方向,比如src 192.168.38.7说明数据包源地址是192.168.38.7,dst net 192.168.38.0指明目的网络地址是192.168.38.0,默认是监控主机对主机的src和dst,即默认监听本机和目标主机的所有数据。
c):协议关键字:
包括ip、arp、rarp、tcp、udp、icmp等,
d):其他关键字:
运算类型的:or、and、not、!
辅助功能型的:gateway、less、broadcast、greater
- 普通抓包
tcpdump -i ens33
- 指定查询的次数为3次,并且写入1.out内
tcpdump -i ens33 -c 3 -w 1.out
- 指定查询IP1和IP2通信的所有数据包
#这里的host代表的是这个主机,查询192.168.174.4和1.82.232.108的数据包
tcpdump host 192.168.174.129 and 1.82.232.108
- 指定查询源地址为IP1,目的地址为IP2的数据包
#源----->目的
tcpdump src 1.82.232.108 dst 192.168.174.129
#源----->目的并显示详细信息
tcpdump src 1.82.232.108 and dst 192.168.174.129 -vnn
#任意到目的的信息
tcpdump dst 192.168.174.129
#抓取某个协议
tcpdump -i eth0 -nn arp
6.4.6.文件比对
- 使用diff命令,不对两个文件的不同
diff -car 1 2
bat
#这里的host代表的是这个主机,查询192.168.174.4和1.82.232.108的数据包
tcpdump host 192.168.174.129 and 1.82.232.108
``
- 指定查询源地址为IP1,目的地址为IP2的数据包
#源----->目的 tcpdump src 1.82.232.108 dst 192.168.174.129 #源----->目的并显示详细信息 tcpdump src 1.82.232.108 and dst 192.168.174.129 -vnn #任意到目的的信息 tcpdump dst 192.168.174.129
``bash
#抓取某个协议
tcpdump -i eth0 -nn arp
### 6.4.6.文件比对
- 使用diff命令,不对两个文件的不同
```bash
diff -car 1 2