linux服务器权限配置:
安装的server版,很多端口的没有开启,附加的软件也没有安装;ssh禁止用户登录
禁止用户上网,禁用scp命令
限制用户umask权限
如果不想一些人使用"su"命令成为root或切换到其他用户,那么在"/etc/pam.d/su"做一些修改就可以。这些可以提高系统的安全性。
在/etc/pam.d/su下添加这两行:
auth sufficient /lib/security/$ISA/pam_rootok.so
auth required pam_wheel.so use_uid group=admin
[root@lyt ~]# passwd -l user1 #使用-l指令将user1锁定,这样就不能登录了,但是可以从root账户切换到user1用户
auth required pam_succeed_if.so user != root quiet 放到文件 /etc/pam.d/login
禁止本地登录root
2:过修改/etc/passwd文件中用户登录
[root@lyt ~]# vim /etc/passwd
[root@lyt ~]# su – user1 #登录到user1
3:创建/etc/nologin文件,除root可以登录外,其他用户都不可以登录
/etc/passwd把root账户的shell改为/sbin/nologin,这样会阻止su或者ssh登录
二:限制root用户登录修改/etc/securetty
- 如果你希望root用户不能从tty2登录,则可以将/etc/securetty中的tty2删除即可:
限制ssh用户
DenyUsers hanghang
修改 /etc/ssh/sshd_config 文件后,重启 sshd 服务:
service sshd restart
1,只允许某个IP登录,拒绝其他所有IP
在 /etc/hosts.allow 写:
sshd: 1.2.3.4
在 /etc/hosts.deny 写:
sshd: ALL
用 iptables 也行:
iptables -I INPUT -p tcp --dport 22 -j DROP
iptables -I INPUT -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT
2,禁止某个用户通过ssh登录
在/etc/ssh/sshd_conf添加
AllowUsers 用户名
或者
AllowGroups 组名
或者
DenyUsers 用户名
**vi /etc/pam.d/sshd
增加
auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/sshd_user_deny_list onerr=succeed
所有/etc/sshd_user_deny_list里面的用户被拒绝ssh登录**
1、修改SSH监听端口
默认情况下,SSH监听连接端口22,攻击者使用端口扫描软件就可以看到主机是否运行有SSH服务,将SSH端口修改为大于1024的端口是一个明智的选择,因为大多数端口扫描软件(包括nmap)默认情况都不扫描高位端口。
打开/etc/ssh/sshd_config文件并查找下面这样的行:
Port 22
修改端口号并重新启动SSH服务:
/etc/init.d/ssh restart
3、仅允许特定的用户通过SSH登陆
你不一个允许root用户通过SSH登陆,因为这是一个巨大的不必要的安全风险,如果一个攻击者获得root权限登陆到你的系统,相对他获得一个普通用户权限能造成更大的破坏,配置SSH服务器不允许root用户通过SSH登陆,查找下面这样的行:
PermitRootLogin yes
将yes修改为no,然后重新启动服务。现在,如果你想使用特权用户,你可以先以其他用户登陆,然后再转换到root。
1:使用粘滞位可以做到,下面是介绍.
强制位与冒险位、粘滞位
针对u,g,o,分别可设 set uid,set gid,及sticky bit(粘滞位)。
强制位与冒险位、粘滞位添加在执行权限的位置上。如果该位置上原已有执行权限,则强制位与冒险位以小写字母s或t的方式表示;否则,以大写字母表示,大写字母S、T表示为空。(因为文件本身就不具备执行权限,那就没有权限给其他人使用了,所以为空。)
set uid与set gid在u和g的x位置上各采用一个s,sticky使用一个t。
suid: 意味着如果某个用户对属于自己的程序(只适用于二进制程序且对目录无效)设置了这种权限,那么其他用户在执行这程序时,就会暂时具有该文件拥有者的权限,完成之后恢复对应的权限。 对于shell脚本无效,因为shell脚本是将很多二进制执行文件调用而已,所以suid的权限部分还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。
例如password命令
[root@node1 ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd
[root@node1 ~]#
sgid: 可以用在两个方面:
文件:如果sgid设置在二进制文件上,则不论用户是谁,执行该程序的时候,它的有效用户组将会变成该程序的用户组所有者。
目录:如果sgid是设置在A目录上,那么则该A目录内所建立的文件或目录的用户组将会是A目录的用户组。如tmp目录。
sticky Bit: 当前只针对目录有效,对文件无效。默认情况下,如果一个目录上有w和x权限,则任何人可以在此目录中建立与删除文件。但是如果在该目录上设置了sticky Bit,、那么在该目录中创建的文件或目录,只有文件的拥有者与系统管理员(root)才有权限删除该文件。
强制位与冒险位、粘滞位对应的权限数字为:
suid:4
sgid:2
sticky Bit: 1
2:使用chattr命令
功能介绍
设置文件隐藏属性,使用权限超级用户(chattr changes the file attributes on a Linux second extended file system.)。
语法格式
chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录
参数
-R:递归处理所有的文件及子目录。
-V:详细显示修改内容,并打印输出。
-:取消某个特殊参数。
+:增加某个特殊参数。
= :指定特定的参数。
A:Atime,告诉系统不要修改对这个文件的最后访问时间。
S:Sync,当应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
s:当文件设置了s参数时,它将会彻底从这个硬盘空间中删除掉,它的数据块会用0填写。
a:Append Only,系统只允许在这个文件之后增加数据,而不能删除这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立文件,而不允许删除任何文件,也不允许修改目录下原有的文件。只有root用户可以设置这个属性。
i:Immutable,系统不允许对这个文件进行任何的修改,包括删除、修改、设置连接(可以设置软链接),也无法增加数据。如果目录具有这个属性,那么任何的进程都不能修改目录之下的文件,不允许建立和删除文件。
-j:当ext3格式文件系统挂载的时候使用了参数"data=ordered" or "data=writeback" options时,设置j属性将会使文件在写入时先记录在journal中;但是,当文件系统设置参数为data=journalled时,由于已经设置了日志,那么设置无效。
D:当应用程序对某个目录执行了写操作,使系统立刻把修改的结果写到磁盘。
d:如果一个文件设置了d参数,那么当dump程序运行的时候将忽略归该文件的dump。
c:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。
u:Undelete,当一个应用程序请求删除这个文件时,系统会保留其数据块以便以后能够恢复删除这个文件。
说明
chattr 命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。
关闭数据执行保护:
http://www.ibm.com/developerworks/cn/linux/l-cn-gccstack/index.html
GCC 中的堆栈保护实现
Stack Guard 是第一个使用 Canaries 探测的堆栈保护实现,它于 1997 年作为 GCC 的一个扩展发布。最初版本的 Stack Guard 使用 0x00000000 作为 canary word。尽管很多人建议把 Stack Guard 纳入 GCC,作为 GCC 的一部分来提供堆栈保护。但实际上,GCC 3.x 没有实现任何的堆栈保护。直到 GCC 4.1 堆栈保护才被加入,并且 GCC4.1 所采用的堆栈保护实现并非 Stack Guard,而是 Stack-smashing Protection(SSP,又称 ProPolice)。
SSP 在 Stack Guard 的基础上进行了改进和提高。它是由 IBM 的工程师 Hiroaki Rtoh 开发并维护的。与 Stack Guard 相比,SSP 保护函数返回地址的同时还保护了栈中的 EBP 等信息。此外,SSP 还有意将局部变量中的数组放在函数栈的高地址,而将其他变量放在低地址。这样就使得通过溢出一个数组来修改其他变量(比如一个函数指针)变得更为困难。
GCC 4.1 中三个与堆栈保护有关的编译选项
-fstack-protector:
启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。
-fstack-protector-all:
启用堆栈保护,为所有函数插入保护代码。
-fno-stack-protector:
禁用堆栈保护。
gdb多进程的调试:
set follow-fork-mode
- parent: fork之后继续调试父进程,子进程不受影响。
- child: fork之后调试子进程,父进程不受影响。
set detach-on-fork
- on: 断开调试follow-fork-mode指定的进程。
- off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
Attach子进程
众所周知,GDB有附着(attach)到正在运行的进程的功能,即attach
pstree -H pid | grep xxx
查看进程树
python -c 'print "\x41"*120' | netcat 127.0.0.1 8085 测试代码
echo 0 > /proc/sys/kernel/randomize_va_space
关闭地址空间随机化
参考地址http://www.linuxidc.com/Linux/2011-10/44764.htm
静态编译
为了避免链接干扰,静态编译该shellcode,命令为:
gcc -static -g -o shellcode shellcode.c
-fno-stack-protector -Z execstack
防火墙配置小记
!!!注意不要远程去设置防火请规则!!!
下面我们关闭所有的端口
]# iptables -P INPUT DROP
]# iptables -P FORWARD DROP
]# iptables -P OUTPUT DROP
再查看一下 iptables -L -n
下面我只打开22端口,看我是如何操作的,就是下面2个语句
]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
再查看下 iptables -L -n 是否添加上去, 看到添加了
-A 参数就看成是添加一条 INPUT 的规则
-p 指定是什么协议 我们常用的tcp 协议,当然也有udp 例如53端口的DNS
到时我们要配置DNS用到53端口 大家就会发现使用udp协议的
而 --dport 就是目标端口 当数据从外部进入服务器为目标端口
反之 数据从服务器出去 则为数据源端口 使用 --sport
-j 就是指定是 ACCEPT 接收 或者 DROP 不接收
设置只能同时登录一个root
[root@localhost ~]# cat /etc/securetty
tty1(本地)
pts/0 #这里我们只远程登录一个root用户数
普通用户受限
localhost ~ # tail -1 /etc/security/limits.conf
yanu - maxlogins 1
localhost ~ # ssh
Password:
Last login: Fri Apr 8 13:55:44 CST 2011 from localhost on pts/4
Too many logins for 'yanu'.
Connection to 127.0.0.1 closed.
localhost ~ #
root不受此限制:
13:58:31 > w root
13:58:34 up 3:12, 7 users, load average: 0.26, 0.15, 0.14
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/4 13:57 1:15 0.00s 0.00s -bash
13:58:34 > ssh
Password:
Last login: Fri Apr 8 13:57:46 CST 2011 from localhost on pts/6
localhost ~ #
iptables 之 基本设置 + SSH的规则 (2012-03-13 20:52)
分类: Linux
注意:iptables只能被拥有超级权限的用户设置。
重启 清空 iptables 规则;在终端输入:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
下面的指令厉害了,可以让你的电脑成为铜墙铁壁,百毒不侵,当然这样的绝对防御是有代价的,封起了所有的端口,自己也无法上网了。。。。。。。。
禁止所有数据进入:
iptables -P INPUT DROP
禁止所有数据送出:
iptables -p OUTPUT DROP
禁止所有FORWARD:
iptables -p FORWARD DROP
很明显DROP在iptables中是禁止的意思
下面要开始设置iptables规则了。
开放网卡:
iptables -A INPUT -i eth0 -j ACCEPT
意思是:接受所有来源于eth0网卡的数据;
iptables -A INPUT -i eth0 -j ACCEPT
意思是:接受所有非来源于eth0网卡的数据(当然有多张网卡的时候才有用);
开放端口:
下面就于开放SSH默认的22端口为例:(SSH只开放tcp协议的就行了。upd我只是举例的。)
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
意思是:允许eth0网卡tcp协议的22端口的进入数据;
iptables -A INPUT -i eth0 -p udp --dport 22 -j ACCEPT
意思是:允许eth0网卡udp协议的22端口的进入数据;
iptables -A FORWARD -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth0 -p udp --dport 22 -j ACCEPT
还没有搞清楚FORWARDS是什么作用。不好意思。
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
意思是:允许tcp协议的22端口的输出数据;
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT
意思是:允许udp协议的22端口的输出数据;
保存设置:iptables-save -c > iptables.save
注意,这个iptables.save是执行这条命令后在当前文件下生成的iptables存档文件。
载入iptables.save文档: iptables-restore -c /你保存iptables.save的目录/iptables.save
提示,如果要每次重启电脑时都能自动载入iptables的规则:
sudo vi /etc/rc.local
在文件rc.local的exit 0 的前一行加入:iptables-restore -c /你保存iptables.save的目录/iptables.save
如图:
结束!!!!!
SSH Server一般会根据设定的设计自动断开SSH连接,这就是为什么一定时间不操作SSH,SSH会自动断开的原因。按以下步骤可以延长自动断开的时间。以centos5.3为例:
编辑配置文件
nano /etc/ssh/sshd_config
添加两个参数
ClientAliveInterval 20
ClientAliveCountMax 300
按以上的配置的含义就是 SSH每20秒向客户端发送一次心跳 ,连续发送300次没有收到客户端道应答,则断开客户端。系统默认是ClientAliveInterval为15,ClientAliveCountMax 为3,所以SSH会在45秒之后断开。
保存设置并重载配置文件
/etc/init.d/sshd restart
不保存bash的历史记录
.bashrc 最后加
unset HISTFILE
history -c 清空记录