内核编译丶 sed 丶 awk
Linux: 单内核
模块化: 动态
- /lib/modules
- lsmod,modinfo,modprobe,insmod,,modprobe -r ,rmmod
dep 文件: 模块的依赖关系
sysbols: 符号映射
depmod: 用来生成模块依赖关系
kernel 文件夹下
arch: 架构
crypto: 加密模块
drivers: 驱动
fs: 文件系统
有两部分组成
kernel: 内核调试模块
lib: 内核本身通用库
mm:
net: 网络协议的实现
netfilter: 软件防火墙
openvswith: 虚拟机
sunrpc:
sound: 声音
CentOS6:
与官方 kernel 可能不一样
src.rpm
源码 rpm 包 + specs 文件
步骤:
1. 创建 mockbuild 用户
2. 切换至 mockbuild 用户, 而后安装 src.rpm 包
3.rpmbuild -bb|-ba ~/rpmbuild/SPECS/package_name.spec
4. 制作完成的 rpm 包: 位于 / root/rpmbuild/RPMS/x86_64 中
/usr/src,/usr/local/src
编译内核:
可能需要的模块不多, 红帽或者 CentOS 为了使版本更通用,
y: 编译进核心
m: 编译成模块
- make config
- make allyesconfig
- make allnoconfig
- make menuconfig
建议将 / boot / 下的 config 文件拷贝到当前目录下, 叫. config
- make kconfig(KDE 桌面环境, 并且安装了 qt 开发环境)
- make gconfig(Gnome 桌面环境, 并且安装 gtk 开发环境)
第二步: 编译
make -j #
第三步: 安装模块
make modules_install
第四步: 安装内核
make install
第五步: 检查. 测试
grub.conf 中是否已经有新内核配置项
重启系统并启用新内核
安装一个新桌面:
screen 命令:
screen: 打开一个新的 screen
隐藏: ctrl+a,d
重新打开隐藏的 screen:
显示个 screen ID: screen -ls
重新打开 screen -r Screen_ID
查看硬件信息:
- lspci
- hal-device
- lspcmcia
- lscpu
- lsdiff
- lsusb
- lsdlk
dmidecode: 查看 BIOS,
RHEL src.rpm
补充: http://ftp.redhat.com/pub/redhat/linux/enterprise
编译安装新内核:
1. 获取内核编码, 解压至 / usr/src
- tar xf Linux-3.13.5.tar.xz -C /usr/src
- ln -sv /usr/src/Linux-3.13.5 /usr/src/Linux-
2. 配置内核特性
- cp /boot/config-*/usr/src/Linux/.config
- make menuconfig
3. 编译内核
make [-j #]
最多为 CPU 物理核心总数的两倍
4. 安装内核模块
make modules_install
5. 安装内核
make install
6. 验证并测试
cat /boot/grub/grub.conf
重启系统并应用新系统
二次编译如何做清理操作:
make clean: 只清理编译生成的文件, 但不删除配置文件. config
make mrproper: 删除编译生成的文件和. config
make distclean: 重置源代码树
将编译的文件放置于源码不同的路径:
- mkdir /path/to/somewhere
- cd /path/to/somewhere
- ./configure --ksource=/usr/src/Linux
如何实现内核的部分编译:
1. 只编译某子目录下的相关代码:
cd /usr/src/Linux
make 子目录文件
- make SUBDIR=arch/
- make drivers.NET/
2. 只编译部分模块
- make M=path/to/dir/
- make M=drivers.NET/
3. 只编译某一个模块
- make path/to/dir/module_name.ko
- make drivers.NET/e1000/e1000.ko
4. 将编译后的结果放置于别的目录中
make O=/path/to/somewhere
如何实现交叉编译
make ARCH = 架构
以 ARM 为例:
make ARCH=ARM 默认编译文件
树莓派
内核参数的查看与配置:
- /proc/sys/
- kernel.NET vm fs
配置参数:
- echo "string"> /proc/sys/path/to/some_parameter
- echo 1> /proc/sys.NET.ipv4/icmp_echo_ignore_all
- sysctl -w
上面也可写成
sysctl -w.NET.ipv4.icmp_echo_ignore_all=1
查看参数:
sysctl -a
配置文件:
/etc/sysctl.conf
net.ipv4.ip_forward ip 转发
kernel.hostname 主机名
net.ipv4.icmp_echo_ignore_all ping 功能
vm.drop_caches 清除缓存
sysctl -p 重读配置文件
硬件设备: 设备文件
2.4-:2W+
udev: 用户空间程序
kenrel 硬件探测过程在根文件系统挂载前就已经结束, 启动 udev daemon 程序, 要求内核重新探测硬件信息, 并输出 / sys 目录,
由此 udevadmin 工具就可以根据 / sys 目录中硬件信息给每个硬件创建设备文件了
udev rules:udev 规则文件, 用于定义 udev 如何创建设备文件的
- /etc/udev/rules.d/
- kernel+initramfs(根文件系统所在设备的设备驱动模块)-->devtmps(用于在内核初始化时为基本设备创建设备文件的临时文件系统)
如何手动创建设备文件
- mknod
- mknod [option] ...NAME YTPE [MAJOR MINOR]
MAJOR: 主设备号, 表示设备类型
MINOR: 同一设备的不同文件
选项:
-m MODE: 指定权限
例子
mknod -m 660 /dev/testdev b 100 0
sed 初级使用
stream editor
一次只读一行, 只处理一行, 不对源文件做处理, 至输出到屏幕上
模式空间
是一个行编辑器
格式
sed[options] "script" FILE....
选项:
-n: 静默模式, 不输出模式空间内的内容; 默认打印空间模式的内容
-r: 扩展的正则表达式
-f 文件: 指定 sed 脚本文件
-e 'script' -e 'script' : 指定多个编辑指令
-i : 直接编辑原文件
编辑命令:
d: 删除
p: 打印
i \: 在被指定到的行前面插入文本
a \: 在被指定的行的下面插入文本
\n: 换行
r 文件: 在指定位置把另外一个文件的内容插入
w 文件: 将符合条件的所有行保存至指定文件中
=: 显示符号条件的行的行号
s///: 查找条件可以使用模式, 但是要替换的内容不行
地址定界: 自定义的起始行到结束行
- startline,endline
- 1,3
- /pat1/,/pat2/
- /pattern/
用法: sed [options] 'addr1[,addr2]编辑命令' FILE...
sed [options] "addr1[,addr2]编辑命令" FILE... 变量替换使用双引号
正则表达式:
基本的
字符:
.
[]
[^]
次数
*
\?
\{m,n\}
锚定:
- ^
- $
- \<,\b
- \>,\b
分组:
\(\)
引用:
\1,\2,......
扩展:
字符:
.
[]
[^]
次数
*
?
{m,n}
+
锚定:
- ^
- $
- \<,\b
- \>,\b
或:
a|b
分组:
\(\)
引用:
- \1,\2,......
- sed '地址定界 s@查找条件 @替换文件 @'
修饰符:
g:global, 全局替换
i:ignore-case, 不区分字符大小写
awk 命令:
awk: 报告生成工具
把文件中读取带的每一行的每个字段分别进行格式化, 而后进行显示:
支持使用变量, 条件判断, 循环, 数组
- awk --> new awk --> nawk
- GNU awk --> gawk
选项:
-F: 切割符
$0: 整行
$1,$2.....: 位置参数
用法格式:
- awk [options] 'script' FILE...
- awk [options] '/pattern/{action}' FILE...
- action: print $1,$2
模式:
地址定界:/pat1/,/pat2/ 一个范围
/pattern/ 被匹配到的行
experssion 表达式
>,>=,<,<=,==,!=,~(模式匹配)
BEGIN: 执行前操作
END: 执行后的收尾 操作
awk 的常用四种分隔符:
输入:
行分隔符
字段分隔符
输出:
行分隔符
字段分隔符
awk 的内置变量
NF: 最后一个字段
FS: 指定输入分隔符 在 BEGIN 中定义, 指定时要使用 ""
默认为空白
OFS: 输出时指定的分隔符, 在 BEGIN 中定义, 指定时要使用 "", 默认为空白
安装丶 bash 丢失丶 dhcp 丶 pxelinux
anaconda:fedora,Linux 的安装程序
anaconda: 将安装分成两个阶段
安装前配置阶段
键盘类型
安装过程中的语言
支持的语言
时区
选择要使用的磁盘设备
分区格式化
选择要安装的程序包
管理员密码
是否使用 iptables
是否启用 selinux
安装阶段
在目标磁盘上根文件系统
将选定的程序包安装至目标磁盘
如何启动安装过程
MBR:bootloader, 本身可启动的安装光盘
网络启动安装过程
可移动设备, 便携式设备
简装光盘: 只有 isolinux, 能够启动安装过程的
anaconda 的配置文件称为 kickstat
安装前配置阶段:
配置的选项:
必选项:
可选项:
kickstart 文件的组成部分:
命令段: 用于配置系统
- install
- firewall
- part
- lvm
软件包: 指定要安装的程序包及程序包组
%packages 标识
@Base: 使用 @指定包组
lftp: 直接写程序包名
tree:
每行一个
注意: 在程序包前加 -, 不安装相关包
%end : 软件包结束
脚本段:
%pre: 安装过程开始前的预备脚本
所能执行的操作较小, 它是一个首先得环境, 因为其是仅有简装版的 shell 环境
%post: 所有的软件完成之后执行的脚本
此时, 具有完整意义上的 shell 环境, 但并非所有命令都安装, 先确保所有的程序包已经安装
以光盘为例:
MBR-->bootloader,isolinux/
安装树:
noparport: 不探测硬件
启动安装界面时, boot 提示符后, 可以向安装内核传递许多的配置参数, 用于指定安装过程的特性
boot:
test: 文本安装界面
graphical: 图形安装界面
askmethod: 提示用户指定安装方法, 让用户选择使用的安装树
asknetword: 提示用户在安装过程中使用网络功能, 并提示用户配置网络地址
dd: 提示用户指定一个驱动程序所在的设备
ks=: 指定一个安装过程使用的 kickstart 文件
- ks={
- http|https
- }://<sevrer>/<path>
- ks=cdrom:/<path>
- ks=nfs:<server>:/<path>
repo=: 指定安装树位置
- repo=ftp://<path>
- repo={
- http|https
- }://<path>
- repo=nfs:<path>
- ip:
- netmask:
- gateway:
- dns:
- noipv6:
- http://172.16.0.1/centos6.X86_64.cfg
成长是用来发现自己的过去是多么的操蛋
CentOS:
kickstart 文件: 命令段, 软件包段, 脚本段
selinux 限制进程的访问,
permissive 记录到日志
创建光盘映像
mkisofs:-R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "Centos 6.5 X86_64 boot(可改)" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/centos6.5.boot.iso(可改) linuxiso/
光盘中的背景图片
640*480
dhcp server: 告诉客户端到某一位置找一 tftp server, 向此 tftp server 要一个文件
pxe: 安装方式
创建 kickstart 文件的方式:
1, 复制模板 / root/anaconda-ks.cfg. 而后使用 VIM 编辑配置
2. 使用 system-config-kiskstart 来生成, 建议使用 / root/anaconda-ks.cfg 模板生成
ksvalidator 检查 kiskstart 文件的配置是否存在问题
系统故障排除之: bash 程序文件损坏
1. 启动紧急救援模式
2. 获取到 bash 的 rpm 包:
- mkdir /media
- mount -r /dev/dvd /media
- rpm -ivh bash-*.rpm --replacepkgs --root=/mnt/sysimage/
紧急救援模式: 启动了一个工作于光盘上的 Linux
arp
dhcp 和 pxe
DHCP: 动态地址配置协议
前身 bootp: 分配出去以后, 将绑定
leases, 地址租约, 地址池
Dynamic Host Configuration Protocol
C/S 模式
Server:DHCP Server(运行 dhcp 服务)
UDP 服务: 67
Client:DHCP Client(运行 dhcp 程序)
UDP 服务: 68
udp: 适合发送较小的数据报文, 且对时效性要求较高
- A:DHCP DISCOVER
- S:DHCP OFFER(ip/netmask)
- A:DHCP REQUEST(确认使用)
- S:DHCP ACK
- 50%:DHCP REQUEST
- 75%:DHCP REQUEST
- 87.5%:DHCP REQUEST
- DHCP DISCOVER
- DHCP :
- IP,NETMASK,GATEWAY,DNS,NTP SERVER,WINS SERVER,File
- DHCP Client:
- 169.254.X.X
本地地址
有两个进程
一个 dhcpd
一个 dhcrelay, 中继
dhcpd.conf 大致可以分为四个区域:
定义 dhcpd 自身的工作属性:
log-facilify: 日志 facilify
全局地址跟拍属性: options 打头
option router
子网配置:
通常每个作用域通过一个 subnet 定义
- subnet NETWORK_ADDR netmask NETMASK {
- }
主机配置:
通常为某特定 Mac 地址固定的分配一个地址
host 'HOST ID' {
hardware ethernet 08:00:07:26:c0:a5; Mac 地址
fixed-address IP; ip 地址
}
日志服务的配置文件:/etc/rsyslog.conf
文件详解:
ption domain-name "example.org"; 搜索域
option domain-name-servers ns1.example.org, ns2.example.org; 全局默认网关
default-lease-time 600; 默认租约期限
max-lease-time 7200; 最长租约期限
#ddns-update-style none; 动态 dns
og-facility local7; 日志反动地址
subnet 10.254.239.0 netmask 255.255.255.224 {
range 10.254.239.10 10.254.239.20; 地址池
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; 提供的网关
- }
- subnet 10.254.239.32 netmask 255.255.255.224 {
range dynamic-bootp 10.254.239.40 10.254.239.60; 向 bootp 提供服务
option broadcast-address 10.254.239.31; 广播地址
- option routers rtr-239-32-1.example.org;
- }
- subnet 10.5.5.0 netmask 255.255.255.224 {
- range 10.5.5.26 10.5.5.30;
- option domain-name-servers ns1.internal.example.org;
- option domain-name "internal.example.org";
option routers 10.5.5.1; 默认网关
option broadcast-address 10.5.5.31; 广播地址
- default-lease-time 600;
- max-lease-time 7200;
- }
- host fantasia {
hardware ethernet 08:00:07:26:c0:a5; Mac 地址
fixed-address fantasia.fugue.com; ip 地址
- }
- class "foo" {
- match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}定义函数, 用来定义特定系统分配特定的地址
/var/lib/dhcpd 有配置文件
dhcilent -d etho:/ 客户端重新获取 dhcp 地址
总结: dhcp dhcpd /etc/dhcp/dhcpd.conf /etc/rc.d/init/dhcpd /var/lib/dhcp,udp:67,68
PXE:Preboot Execution Environment, 启动前的执行环境
Client: 网卡要支持网络引导
tftp Trivial FTP: 简单文件传输协议, 高效传输小文件(udp:69)
瞬时 (非独立) 守护进程: 他们无需定义在运行级别下, 只需要一次性的定义 xinetd 的运行级别
独立 (standalone) 守护进程: 能自我管理, 无需 xinted 提供箭头服务的进程
超级守护进程: xinetd
为那些极少接收用户请求的服务, 专门提供监听功能
tftp:udp:69
瞬时守护进程基于 xinetd 的配置文件:/etc/xinted.d/Service_name
独立守护进程: 能自我管理, 无须 xinetd 提供监听服务的进程
- chkconfig xinetd on
- service xinetd start
- chkconfig Service_name on
- service xinetd restart
Linux 上的 tftp:
服务器: tftp-server
客户端: tftp
在 dhcp 添加
next-server ip 地址
filename="pxelinux.0"
配置步骤:
前提: 需要安装 apache 服务器, 并启动 httpd 服务!
- mkdir /media/cdrom
- mount -r /dev/dvd /media/cdrom
- vi /etc/yum.repo.d/
1. 配置 DHCP 服务器
- yum -y install dhcp
- VIM /etc/dhcp/dhcpd.conf
自定义 subnet{
- ...
- next-server
- filename ""
- }
- service dhcpd restart
- tail -f /var/log/boot.log
2 配置 tftp-server
- yum -y install xinetd tftp-server tftp
- chkconfig xinetd on
- chkconfig tftp on
- service xinetd start
3 准备安装树
- mkdir /var/www/HTML/centos6
- mount --bind /media/cdrom /var/www/HTML/centos6
- service httpd start
4. 准备 tftpboot 下的文件
- yum -y install syslinux
- cp /media/cdrom/images/pxeboot/{
- vmlinuz,initrd.img
- } /var/lib/tftpboot/
- cp /media/cdrom/isolinux/{
- boot.msg,vesamenu.c32,splash.jpg
- } /var/lib/tftpboot/
- cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
- mkdir /var/lib/tftpboot/pxelinux.cfg
- cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
5. 提供 kickstart 文件
注意: url 及 repo 后的路径要修改为可用安装树的路径;
- url --url=http://192.168.48.128/centos6
- repo --name="CentOS-6.5" --baseurl=http://192.168.48.128/centos6
编辑好 kickstart 文件后保存至 / var/www/HTML 目录下; 假设为 ks.cfg
6)配置引导程序能自动加载 kickstart 文件.
编辑 / var/lib/tftpboot/pxelinux.cfg/default
在 label 为 Linux 项的 append 一行后附加:
- ks=http://192.168.48.128/ks.cfg
- SELinxu:Secure Enhenced Linux
获取 selinux 的当前状态:
getenforce
临时启用或禁用
setenfoce 0|1
永久启用:/etc/sysconfig/selinux
- /etc/selinux/config
- SELINUX={
- enforcing|permissove|disabled
- }
ls -Z: 查看
Mac: 强制访问控制
Openssl 丶 SSH 丶脚本信息捕获
passwd:
加密方式:
对称加密, 公钥加密, 单向加密
加密, 解密
明文: plaintext,cleartext -->密文 -->
对称加密:
加密算法 + 口令
明文 --> 密文
字典攻击
加密方, 解密方使用同一个口令
DES(56bits): 数据加密标准
3DES
AES(128bits): 高级加密标准
- Blowfish
- Twofish
- IDEA
- RC6
- CAST5
- Serpent
特性:
1. 加密 / 解密使用统一口令
2. 将原文分割成固定大小的数据块, 对这些块进行加密
ECB,CBC
1. 口令传输
2. 密钥太多
密钥交换:
用户认证:
数据完整性:
密钥交换(IKE:Inernet Key Exchange):DH 算法
非对称加密: 公开公钥, 私钥私有, 只有一组密钥对 (公钥和私钥组成) 才能对消息进行加密和解密, 公钥和私钥都能进行加密或者解密. 公钥一般来加密数据, 私钥一般来签名数据.
加密算法: RSA,EIGmal,DSA
1. 密钥交换
2. 用户身份认证
单向加密:
抽取数据特征码:
MD5,SHA1,SHA512,CRC-32(循环冗余校验码)
1. 完整性,
消息认证算法: Mac(Message Authenntication Codes)
CBC-Mac
HMAC
雪崩效应
定长输出:
使用私钥钥来加密特征码 (保留数据的完整性) 和数据 (保证数据的来源) 再将两者进行对称加密(速度快), 接着再用对方的公钥来加密密码(保证安全性)
PKI:Pubile key Infrastucture 公钥基础设施
openssl gpg
openssl: 套件, 开源程序
libcrypto: 通用功能的加密库
libssl: 用于实现 TLX/SSL 的功能
openssl: 多功能命令工具
生成密钥, 创建数字证书, 手动加密解密数据
加密解密技术常用的功能及算法:
对称加密:
工具: gpg openssl enc
加密: openssl enc -des3 -a -salt -in /ets/fstab -out /tmp/fstab.cipher
解密: openssl enc -d -dec3 -a -salt -in /tmp/fstab.cipher -out 文件
单向加密:
特性: One-Way
Collision-free:
算法
- md5:128bits
- sha1:160bits
- sha512:512bits
工具: sha1sum,md5sum,openssl dgst
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1][-out filename] /path/to/somefile
Mac: 信息摘要码, 单向加密的延伸应用
应用: 用于实现在网络通信中保证所传输的数据完整性
机制:
CBC-Mac
HMAC: 使用 md5 和 sha1 算法
用户认证: 每一个用户的密码即使是相同的, 他们的加密方式也不同, 因为是不同用户. 可以指定 - salt string 即可生成相同的加密
工具: passwd openssl passwd
公钥加密: 公钥加密, 私钥解密
密钥对:
公钥: pkey
私钥: skey
算法: RSA,EIGamal
工具: gpg openssl rsautl
数字签名: 私钥加密, 公钥解密
算法: RSA,EIGamal,DSA
- DSA:Digital Signature Algorithm
- DSS: Digital Signature standard
密钥交换: IKE
算法: DH(Diffie-Hellman), 公钥加密
数字证书:
第三方机构使用一种安全的方式把公钥分发出去
证书格式: x509,pkcs 家族
x509 格式:
公钥和有效期限:
持有者的个人合法身份信息;(主机名), 所以输入主机名所对应的 IP 地址, 有可能会访问不到.
证书的使用方式
CA 的信息
CA 的数字签名
谁给 CA 发证: 自签署证书
用户
1. 生成一对密钥
2. 把所需信息和公钥按固定格式制作成证书申请
CA 机构
1. 自签证书
2. 签署证书
3. 传给用户
4. 维护吊销列表
OpenCA
用 openssl 实现是有 CA
配置文件 / etc/pki/tls/openssl.cnf
命令:
谁给 CA 发证: 自签署证书
用 openssl 实现私有 CA:
配置文件:/etc/pki/tls/openssl.cnf
生成密钥对儿:
# (umask 077; openssl genrsa -out private/cakey.pem 2048)
如果想查看公钥:
# openssl rsa -in private/cakey.pem -pubout -text -noout
生成自签证书:
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
用 openssl 实现证书申请:
在主机上生成密钥, 保存至应用此证书的服务的配置文件目录下, 例如:
- # mkdir /etc/httpd/ssl
- # cd /etc/httpd/ssl
- # (umask 077; openssl genrsa -out httpd.key 1024)
生成证书签署请求:
# openssl req -new -key httpd.key -out httpd.csr
将请求文件发往 CA;
# scp httpd.csr 192.168.48.128:/tmp/
CA 签署证书:
签署:
# openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days DAYS
将证书传回请求者
吊销证书:
# openssl ca -revoke /path/to/somefile.crt
speed 测试当前系统上的加密算法的性能
version: 版本
s_client ssl/tls client program 测试连接性的
rand: 用来生成伪随机数字
openssl rand -hex #
openssl: 私有 CA
证书格式
公钥和有效期限:
持有者的个人合法身份信息;(主机名)
证书的使用方式
CA 的信息
CA 的数字签名
对称加密: 数据私密性
公钥加密: 密钥交换(对方的公钥), 数据加密(对方的公钥), 身份认证(自己的私钥)
单向加密: hash 码, only-way hash
openssl 补充材料:
openssl 中有如下后缀名的文件
.key 格式: 私有的密钥
.crt 格式: 证书文件, certificate 的缩写
.csr 格式: 证书签名请求(证书请求文件), 含有公钥信息, certificate signing request 的缩写
.crl 格式: 证书吊销列表, Certificate Revocation List 的缩写
.pem 格式: 用于导出, 导入证书时候的证书的格式, 有证书开头, 结尾的格式
常用证书协议
x509v3: IETF 的证书标准
x.500: 目录的标准
SCEP: 简单证书申请协议, 用 http 来进行申请, 数据有 PKCS#7 封装, 数据其实格式也是 PKCS#10 的
- PKCS#7: 是封装数据的标准, 可以放置证书和一些请求信息
- PKCS#10: 用于离线证书申请的证书申请的数据格式, 注意数据包是使用 PKCS#7 封装这个数据
- PKCS#12: 用于一个单一文件中交换公共和私有对象, 就是公钥, 私钥和证书, 这些信息进行打包, 加密放在存储目录中, CISCO 放在 NVRAM 中, 用户可以导出, 以防证书服务器挂掉可以进行相应恢复. 思科是. p12, 微软是. pfx
ssl: 网景公司开发
Secure Scocket Layer
安全的套接字层
TLS:Transport Layer Security
安全的传输层
远程登录:
telnet
telnet 服务: 明文传输
监听 tcp 协议的 23 号端口
ss -tan |grep 23
禁止管理员直接登陆
使用普通用户登录. 而后 su 到管理员
SSH:Secure SHell
监听 tcp 协议的 22 号端口
/etc/services 解析库, 进程 <-> 端口
SSH 文本协议: 字符通信
sshv1,sshv2
由于 sshv1 是居于 CRC-32 做 Mac, 因此, 不安全, 建议勿用
sshv2 基于双发主机协商选择最安全的 Mac 实现机制
加密机制和 Mac 机制是双方协商选定
基于 DH 实现密钥交换, 基于 RSA 或 DAS 实现身份认证
客户端通过检查服务端的主机密钥来判断是否与其进一步通信
OpenSSH(C/S)
Server: 监听 tcp22
Client: 程序
Windows 客户端: xmanager(xshell),SecureCRT,putty,sshshellcilent
openssh 客户端组件:
- SSH
- SSH Username@HOST [command]
- SSH -l Username HOST [command]
-p port: 指定要连入端口
SSH 认证机制:
基于口令
基于密钥
客户端在本地生成一对密钥
客户端将公钥复制到服务器, 要登陆的用户的家目录下的隐藏目录. SSH 中的一个名为 authorized_keys 或 authorized_keys2 中
配置过程:
1. 生成密钥对, 客户端
SSH-key -t rsa
生成的密钥默认保存至当前家目录下的. SSH 下的 id_rsa, 公钥在 id_rsa.pub
文件中
2. 复制密钥至远程主机:
SSH-copy-id -i 公钥文件 登陆用户 @远程 ip 地址
scp: 类 cp 命令, 基于 SSH 协议跨主机复制
scp SRC1 SRC2 .... DEST
分两种情况:
1. 源文件在本机, 目标为远程
scp /path/to/somefile .... Username@HOST:/path/to/somewhere
2. 源文件在远程, 目标在本机
scp Username@HOST:/path/to/somefile /path/to/somewhere
-r 当源文件为目录, 以实现递归复制
-p: 保留源文件的复制及修改时间戳, 以及权限
-q: 静默模式
-P PORT: 指定服务器端口
sftp: 是基于 SSH 的 ftp 协议
只要 OpenSSH 的服务器端有以下项, 则代表支持 sftp
Subsystem sftp /usr/libexec/openssh/sftp-server
用法: sftp[username@]HOST
服务器端: sshd
配置文件 /etc/SSH/sshd_config
服务脚本 /etc/rc.d/init.d/sshd
脚本配置文件:/etc/sysconfig/sshd
查看 config 文件的帮助
man sshd_config
ListernAddress 当前主机的监听地址
Protocol 协议版本
- # HostKeys for protocol version 2
- #HostKey /etc/SSH/ssh_host_rsa_key
- #HostKey /etc/SSH/ssh_host_dsa_key
验证主机的公钥
- #KeyRegenerationInterval 1h 密钥的使用时间
- #ServerKeyBits 1024 密钥长度
- #LogLevel INFO 日志级别
- #LoginGraceTime 2m 登陆宽限期
- #PermitRootLogin yes root 是否可以登录
- #StrictModes yes 严格模式, 家目录 属主 属组
- #MaxAuthTries 6 最多可以承受的次数
- #MaxSessions 10
最大的连接数
PasswordAuthentication yes 是否使用用户名和密码的方式
Kerberos 集中认证管理
X11Forwarding yes 是否转发图形窗口
AllowUsers user1 user2
用户白名单
Allowgroups 组白名单
DenyUser 用户黑名单
用户登录信息获取
lastlog: 显示用户最近一次的登录信息, 成功的 /var/log/wtmp
lastb: 显示用户登录的信息, 并尝试失败的 /var/log/btmp
用户成功登陆的日志信息
last
使用 SSH 的最佳方式
- 1)only use SSH protocol 2
- 2)limit users SSH access
- Allowusers root vivek jerry
白名单
denyUser saroj anjali foo
黑名单
3)configure Idle Log out timeout Interval 配置空闲超时长.
- ClientAliveCountMax 300
- ClientAliveInterval 0
- 4)Firwall SSH Port # 22
使用 iptables 设置 SSH 服务安全访问策略
- 5)change SSH port and Limit IP binding
- port 300
- Listaddress 192.168.1.5
- ListenAddress 202.54.1.5
勿使用默认 22 端口
- 6)use Strong SSH passwords and passphrase
- genpasswd(){
- local 1=$1
- [ "$1" == "" ]&& 1=20
- tr -dc A-Za-z0-9_</dev/urandom | head -c ${
- 1
- } | xargs
- }
使用足够长足够复杂的密码, 且定期更换.
7)use Public key Based AUthentication
使用公钥认证.
- 8)disable Empty password
- 9)thwart SSH crakers (Brute Force attack)
- google:SSH best practice
- 10)rate-limit incoming port # 22 COnnections
限制 SSH 访问频度
11)use log analyzer
记录好日志, 经常做日志分析.
总结: SSH,scp.sftp,sshd
- SSH /etc/SSH/ssh_config
- sshd /etc/SSH/sshd_config
bash 编程的信号捕获
trap 陷阱
- trap 'command' signal
- kill -l
KILL 无法捕捉
信号捕捉用于: 在中途中止时做一些清理操
来源: http://www.bubuko.com/infodetail-3006720.html