任何管理员用户都可以使用sudo来临时使用root权限
安装包(yum命令与apt类似)
搜索已经安装的软件
- Ubuntu/Debian系统 dpkg --list
- CentOS系统 yum list installed
删除某个已经安装的软件
- Ubuntu/Debian系统 apt-get remove +包名
- CentOS系统 yum remove +包名
更新本地安装包的源,一般在安装软件的时候用 apt-get update
yum install epel-release(CentOS系统,通过epel版的软件来获取)
安装软件 apt-get install +安装包名称
- 例如:安装apache2 apt-get install apache2
升级软件包 apt-get upgrade
下载软件包 wget +网址
- 例如:从网络下载一个文件并保存在当前目录 wget http://cn.wordpress.org/wordpress-3.1-zh_CN.zip
- wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。"wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。
解压缩包
- .bz2和.gz存档文件是使用不同的压缩算法创建的,gzip压缩时间更少,但生成的存档文件比bz2大。对于解压gzip,可以使用zcat在一步之内将解压的文本装载到内存中。
- tar xjf +压缩包名称.tar.bz2
- tar xzf +压缩包名称.tar.gz
建立与删除链接
符号链接(软链接):
- 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 2.软链接可以 跨文件系统 ,硬链接不可以
- 3.软链接可以对一个不存在的文件名进行链接
- 4.软链接可以对目录进行链接
硬链接:
- 1.硬链接,以文件副本的形式存在。但不占用实际空间。
- 2.不允许给目录创建硬链接
- 3.硬链接只有在同一个文件系统中才能创建
建立符号链接 ln - s选项
建立硬链接 ln
删除链接 rm -rf symbolic_name 注意不是rm -rf symbolic_name/
对文件操作
- 文件权限(读-写-执行权限) rwx 111=7
- 文件所有者-组-其他用户
复制文件 cp
复制目录 cp -r(递归地)
更改文件读取权限 chown -R(递归地)
语法:chown 用户名:组名 文件路径(可以是就对路径也可以是相对路径)
例1:chown root:root /tmp/tmp1
就是把tmp下的tmp1的用户名和用户组改成root和root(只修改了tmp1的属组).
例2:chown -R root:root /tmp/tmp1
就是把tmp下的tmp1下的所有文件的属组都改成root和root。
更改文件拥有权限(让文件的所有者和组拥有该文件的全部权限) chmod 770
语法:chmod [who] [+ | - | =] [mode] 文件名
who可是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
mode 所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
为用户添加到组 usermod -aG +组名 +用户名
查看文件 ls -参数
- -z 显示文件的安全环境)
- -l 查看详情
创建、修改文件 vim
- vim是老式的文字处理器vi的升级版,相对于较为简单的nano,其功能已经很齐全。
- vim分为三种模式
- 一般模式:以vim打开或新建一个文件就可以直接进入一般模式,在此模式中,你可以使用上下左右来进行光标的移动,可以删除字符或整行,可以复制粘贴文件数据。
- 编辑模式:顾名思义,就是可以编辑文本的模式,在一般模式下,按下“i,I,o,O,a,A,r,R”这些字母可进入编辑模式,进入编辑模式后在左下方会有INSERT或REPLACE的字样。在编辑模式下按下ESC键会退出到一般模式下。
- 命令行模式:在一般模式下,输入” :, / , ? “这三个字符中的任意一个会将光标移动到当前页面最下面的一行,在这个模式中可以进行数据查找、替换、保存、离开vim等操作。
配置防火墙规则(在iptables中)
ufw和firewalld主要是为了解决独立计算机所面临的各种问题而设计的。构建大规模的网络解决方案常常需要额外的iptables功能,或者是其自2014年起的替代品nftables(通过nft这一命令行工具调用)
- iptables
- CentOS系统中的firewalld
- Ubuntu系统中的UncomplicatedFirewall(ufw)
- nftables
配置ufw防火墙以允许通过非标准端口进行通信
# ufw allow 53987/tcp
# ufw allow 52900:53000/tcp (用冒号:在单个命令中打开一个范围内的端口)
审计系统资源
netstat -npl -n参数告诉netstat命令要包括数字端口与地址,-l参数限定只包括监听套接字(socket),-p参数添加监听程序的进程ID
ss -o state established 近来,ss命令已经开始在很多方面替代netstat命令.
systemctl list-unit-files --type=service --state=enabled
- 扫描打开的端口
- 扫描激活的服务
- 搜索已安装的软件(详细操作见开头的安装包部分)
创建用户账号(通过su命令切换到新用户,通过exit命令退出该新用户的shell并返回最初的shell)
创建组 groupadd +组名
- adduser +用户名 Ubuntu/Debian系统
- useradd +用户名 CentOS系统
重启apache systemctl restart apache2
重启SSH服务 systemctl restart ssh (注意:sshd是SSH服务器,所以有时可能为 systemctl restart sshd )
查看最近的10个日志条目 journalctl | tail
设置完配置文件,有的需要执行生效命令确保配置文件已经更改,或者重启服务 systemctl restart +服务
运行ip addr命令列出服务器的网络接口
因为根据定义web服务器暴露在大量的外部通信流中,所以web服务器的安全性应该具有特别高的优先级。
不要认为加密就能保证(guarantees)你的数据是安全的。其只是让错误的人更难以理解这些数据。要使其工作,你就需要一个证书(certificate),这是一个包括了标识域、所有者、密钥以及一个可靠数字签名等信息的文件。
一旦你拥有了证书,浏览器就能够验证你的站点的安全性并在会话过程中仅交换加密的数据。所有广泛使用的现代浏览器都具有预先安装的公共根证书,由此,它们就可以验证到那些任何使用私有证书颁发机构(Certificate Authority,CA)证书的站点的连接。它是以如下方式工作的:
1 客户端浏览器请求服务器身份,以使得两者可以进行握手(handshake)。
2 服务器以发送从CA接收到的证书副本来进行响应。
3 浏览器在根证书列表中比较该证书并确认你的证书没有过期或被取消。
4 如果满足,浏览器使用服务器发送的公钥加密一个对称会话秘钥,并将该密钥发送给服务器。
5 所有传输都将使用该会话密钥进行加密。
超文本传输协议(Hypertext Transfer Protocol,HTTP)用以协同网络上的web客户端与服务器端之间的资源交换。例如,浏览器会请求一个以超文本标记语言(Hypertext Markup Language,HTML)编写的web页面,服务器则通过传输页面内容进行响应。包含有关于会话状态信息的元数据(Metadata,附加到一个包的上下文信息)是由每个数据传输事件生成的,之后,管理员可以用这些信息来找到出现的错误。该协议的HTTPS变体使用了传输层安全(Transport Layer Security,TLS)协议来确保数据传输是安全加密的。
传输层安全(Transport Layer Security,TLS)协议为宿主机-客户端之间的网络数据传输强化数据加密。
微服务(Microservices)是从单个容器运行的单个计算机服务,其是跨多个容器的更大单个应用程序基础设施的一部分。
包(packet)是一个小的数据单元,其可能是从较大数据文件或归档文件中划分出来的。传输后,一组包可以被重新组装为原来的形式。当传输控制协议(Transmission Control Protocol,TCP)被用于网络数据传输,收到这些在网络上传输的包时会检查是否出错,必要时会进行重传。使用用户数据报协议(User Datagram Protocol,UDP)的传输将较TCP更快,但因为不进行纠错,它们仅适用于高度容忍错误的那些操作。
防火墙(firewall)是一个规则集。当一个数据包进入或者离开一个受保护的网络空间时,其内容(特别是关于源、目的以及打算使用的协议的信息)就会被防火墙的规则所测试,以检查是否允许其通过。
SSH:
HTTPS:数据传输量大
你肯定不想任何人对你的服务器进行SSH访问,因此,让我们设置防火墙来对其进行保护。限制SSH访问,仅是源自某个特定IP地址的会话会被允许。为了达到这个目的,先关闭所有的SSH访问,然后仅为一个IP进行开放。
访问网站时,出现不可达的原因:
- 防火墙没关闭
- HTTP(80端口),或HTTPS(443端口),或SSH(22端口)未开启
65535个可用的网络端口被划分为三类:
- 1至1023之间的端口被指定为公认端口,且被预留给诸如SSH(22端口)和HTTP(80端口)等已知服务。永远不要将一个公认端口用于自己的应用程序,这可能会引起冲突。
- 1024至49151之间的端口是注册(registered)端口,表示一些企业和组织已经为他们的应用请求了这个范围的一些特定端口,即使这些应用尚未被广泛采用。例如,端口1812被用于RADIUS认证协议,3306端口是MySQL的专用端口等。
- 49152到65535之间的端口是未注册的(unregistered)并被认为是动态的(或私有的)。这些端口被用于任何临时或特定的应用,特别是在私有网络中。你可以确信,其不会与已知的应用或者服务冲突。
你是否担心正在单个服务器上运行的多个服务会在其中一个被破坏时全都处于风险之中?限制由粗心大意或蓄意为之的用户引起的这类损害的一个方法就是隔离系统资源和进程。那样,即使有人想要超越限制来扩展他们的访问范围,他们也不会实现物理访问。
早前解决该问题的方法是,为每个服务提供一个独立的物理机器。然而,虚拟化可以使得构建竖井式(siloed,或独立的)的基础设施更加简单,成本也更低。该类基础设施常常被称为微服务(microservices),而且允许你启动多个容器,可能一个只用于运行数据库,另一个用于运行Apache服务器,第三个则提供了嵌入到网页中的媒体文件。除了诸多的性能和效率优势之外,微服务体系架构还可以极大地降低各个组件暴露在外的危险。
LXC容器 (默认不启用IPv6)
如果你成功地将自己锁在了LXC容器之外,你可以使用chroot(如第6章中所做的)来禁止或者甚至是重新配置防火墙。首先,停止该容器,随后在LXC容器目录体系(/var/lib/lxc/your-container-name/)中的rootfs目录下运行chroot命令。即使该容器实际上仍在运行,给出的命令提示符也可以让你执行一些命令。现在,请禁止ufw,或者,如果你愿意,执行一些必要的命令来修复该问题,之后退出chroot shell。当再次启动该容器时,你就可以获得SSH的访问:
# lxc-stop -n your-container-name (停止一个运行的LXC容器)
# chroot /var/lib/lxc/your-container-name/rootfs/ (将容器的文件系统挂载到chroot)
# ufw disable
# exit (关闭chroot shell会话)
# lxc-start -d -n your-container-name
Docker容器
提升远程访问安全性(如果你的部署需要一些工业级强度的隔离,请考虑启用SELinux)
PermitRootLogin no (/etc/ssh/sshd_conf文件中的root登录控制行)
PasswordAuthentication no (/etc/ssh/sshd_conf文件中的密码认证控制行)
注意:在每次编辑之后,请一定要重新加载SSH;否则,直到下一次启动时新的设置才会生效:# systemctl restart sshd
SELinux(Security-Enhanced Linux,安全增强Linux)是由Red Hat Linux(以及CentOS)开发的;对于Ubuntu而言AppArmor是更为常见的选择。
拥有相同读写权限的,放在同一组(可以在/etc/group文件中查看)
- 请不要以root用户的身份登录到服务器。在任何需要管理员权限的时候使用sudo总是更好。
- 鼓励管理员以密钥对来使用免密码的SSH访问
- 使用SELinux控制文件系统对象——适用于多用户文件系统
- 利用系统组与最少特权原则
- 隔离容器中的进程
- 扫描危险的用户ID值
查看一下/etc/目录下的passwd文件。该文件中,每个已存在的普通用户和系统用户将都对应一条记录。第一个字段包括了账户名(本例中是root和ubuntu),第二个字段可能包含用x替代的密码(如果存在,该密码会以加密的形式在/etc/shadow文件中保存)。之后的两个字段包括了用户ID和组ID。本例中,ubuntu用户及其组的ID都是1000。而且,如你所见,root的都为0:
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[...]
ubuntu:x:1000:1000::/home/ubuntu:/bin/bash
如果你曾看到一个用户ID和组ID都为0的普通用户,那么你就会知道发生了某些不好的事情,你应该着手对其进行修复。快速、方便地找出问题的一个方法是,在passwd文件上运行awk命令,其会将第三个字段中只有0的所有行打印出来。你可以再次运行该命令,用$4替代$3以提取出组ID字段:
$ awk -F: '($3 == "0") {print}' /etc/passwd
总结
- 使用防火墙,你可以通过协议、端口以及源或目的来控制网络流量。
- 将应用程序配置为监听非标准的网络端口,以增加基础设施的隐藏式安全性(security through obscurity)。
- 使用从CA接收到的证书,客户-宿主浏览器会话会被加密,这将大幅降低传输的数据被盗用的几率。
- 在多用户文件系统上,使用SELinux可以强化全局控制。
- 使用组让用户及进程精确地进行所需资源的访问,可以密切地管理对资源的访问。
- 对运行的进程、安装的软件以及打开的端口进行定期的(脚本化的)审计对于持续的服务器安全非常关键。