linux安全

http://drops.wooyun.org/  最专业的安全知识分享平台

http://www.freebuf.com/  关注黑客与极客

http://book.beifabook.com/product/BookDetail.aspx?Plucode=712105019        Linux安全体系分析与编程目录

最佳的策略是采用分层的方法,即将“老当益壮”的程序,如Snort、 iptables等老前辈与psad、Apparmor、SELinuxu等一些新生力量结合起来,借助强大的分析工具,我们就可以始终站在技术的前沿。

IDS新宠:PSAD。Psad是端口扫描攻击检测程序的简称,它作为一个新工具,可以与iptables和Snort等紧密合作,向我们展示所有试图进入网络的恶意企图。
老当益壮:Snort。它是一款轻量级且易于使用的工具,可以独立运行,也可以与psad和iptables 一起使用
简洁方便:chkrootkit和rootkit。Rootkit检测程序chkrootkit和rootkit Hunter也算是老牌的rootkit检测程序了
多面手:Tripwire。Tripwire是一款入侵检测和数据完整性产品

CGI漏洞

CGI是Common Gateway Interface(公用网关接口)的简称,并不特指一种语言。
Web服务器的安全问题主要包括:1)Web服务器软件编制中的BUG;2)服务器配置的错误。可能导致CGI源代码泄漏,物理路径信息泄漏,系统敏感信息泄漏或远程执行任意命令。CGI语言漏洞分为以下几类:配置错误、边界条件错误、访问验证错误、来源验证错误、输入验证错误、策略错误、使用错误等等。CGI漏洞大多分为一下几种类型:暴露不该暴露的信息、执行不该执行的命令、溢出。


一次利用show files类cgi漏洞成功入侵uta.edu的经历

http://www.chinaunix.net/bbsjh/19/23.html  cgi漏洞利用

httpd的error_log分析

[Mon Apr 06 04:45:39 2015] [error] [client 46.28.206.148] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /
[Mon Apr 06 04:56:57 2015] [error] [client 70.46.57.98] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi
[Mon Apr 06 04:57:01 2015] [error] [client 70.46.57.98] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /
[Tue Apr 07 01:18:45 2015] [error] [client 97.91.223.228] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi
[Tue Apr 07 01:18:49 2015] [error] [client 97.91.223.228] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /

第一步获取域名与ip关系

[Tue Apr 07 11:32:01 1010 /dev/pts/0 192.168.2.250 ~]#ping www.fltdz.com
PING www.fltdz.com (58.64.136.166) 56(84) bytes of data.
64 bytes from 58.64.136.166: icmp_seq=1 ttl=48 time=79.6 ms
64 bytes from 58.64.136.166: icmp_seq=2 ttl=48 time=76.2 ms
64 bytes from 58.64.136.166: icmp_seq=3 ttl=48 time=63.2 ms
^C
--- www.fltdz.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2245ms
rtt min/avg/max/mdev = 63.245/73.044/79.639/7.069 ms

第二步请出瑞士军刀nc(netcat)
[Tue Apr 07 11:32:47 1011 /dev/pts/0 192.168.2.250 ~]#yum install nc

我用get / http/1.1来取得他的webserver的相关信息
[Tue Apr 07 11:32:47 1011 /dev/pts/0 192.168.2.250 ~]#nc -vv 58.64.136.166 80
Connection to 58.64.136.166 80 port [tcp/http] succeeded!
输入下面,然后两次回车
GET / HTTP/1.1

HTTP/1.1 400 Bad Request
Server: nginx/1.0.2
Date: Tue, 07 Apr 2015 03:43:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close

ac
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.0.2</center>
</body>
</html>

0

[Tue Apr 07 11:33:59 1012 /dev/pts/0 192.168.2.250 ~]#

第三步由于信息量太少请出扫描器之王nmap
[Tue Apr 07 11:46:16 1015 /dev/pts/0 192.168.2.250 ~]yum install nmap
[Tue Apr 07 11:46:16 1015 /dev/pts/0 192.168.2.250 ~]#nmap -sS -O -vv 192.168.2.2

Starting Nmap 5.51 ( http://nmap.org ) at 2015-04-07 11:46 CST
Initiating ARP Ping Scan at 11:46
Scanning 192.168.2.2 [1 port]
Completed ARP Ping Scan at 11:46, 0.00s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 11:46
Completed Parallel DNS resolution of 1 host. at 11:46, 0.09s elapsed
Initiating SYN Stealth Scan at 11:46
Scanning 192.168.2.2 [1000 ports]
Discovered open port 111/tcp on 192.168.2.2
Discovered open port 22/tcp on 192.168.2.2
Discovered open port 5500/tcp on 192.168.2.2
Discovered open port 5801/tcp on 192.168.2.2
Discovered open port 5666/tcp on 192.168.2.2
Discovered open port 10000/tcp on 192.168.2.2
Discovered open port 5901/tcp on 192.168.2.2
Discovered open port 2049/tcp on 192.168.2.2
Discovered open port 1521/tcp on 192.168.2.2
Discovered open port 6001/tcp on 192.168.2.2
Discovered open port 10003/tcp on 192.168.2.2
Discovered open port 80/tcp on 192.168.2.2
Completed SYN Stealth Scan at 11:46, 1.10s elapsed (1000 total ports)
Initiating OS detection (try #1) against 192.168.2.2
Retrying OS detection (try #2) against 192.168.2.2
Retrying OS detection (try #3) against 192.168.2.2
Retrying OS detection (try #4) against 192.168.2.2
Retrying OS detection (try #5) against 192.168.2.2
Nmap scan report for 192.168.2.2
Host is up (0.00023s latency).
Scanned at 2015-04-07 11:46:25 CST for 13s
Not shown: 988 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
1521/tcp  open  oracle
2049/tcp  open  nfs
5500/tcp  open  hotline
5666/tcp  open  nrpe
5801/tcp  open  vnc-http-1
5901/tcp  open  vnc-1
6001/tcp  open  X11:1
10000/tcp open  snet-sensor-mgmt
10003/tcp open  documentum_s
MAC Address: E4:1F:13:80:ED:2C (IBM)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=5.51%D=4/7%OT=22%CT=1%CU=34628%PV=Y%DS=1%DC=D%G=Y%M=E41F13%TM=552
OS:3531E%P=x86_64-redhat-linux-gnu)SEQ(SP=108%GCD=1%ISR=109%TI=Z%CI=Z%II=I%
OS:TS=A)OPS(O1=M5B4ST11NW7%O2=M5B4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7%O5
OS:=M5B4ST11NW7%O6=M5B4ST11)WIN(W1=16A0%W2=16A0%W3=16A0%W4=16A0%W5=16A0%W6=
OS:16A0)ECN(R=Y%DF=Y%T=40%W=16D0%O=M5B4NNSNW7%CC=N%Q=)T1(R=Y%DF=Y%T=40%S=O%
OS:A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=Y%DF=Y%T=40%W=16A0%S=O%A=S+%F=AS%O=M5B4ST1
OS:1NW7%RD=0%Q=)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=4
OS:0%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%
OS:Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=16
OS:4%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Uptime guess: 39.383 days (since Fri Feb 27 02:34:52 2015)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=264 (Good luck!)
IP ID Sequence Generation: All zeros

Read data files from: /usr/share/nmap
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.87 seconds
           Raw packets sent: 1103 (52.326KB) | Rcvd: 1076 (46.626KB)
[Tue Apr 07 11:46:38 1016 /dev/pts/0 192.168.2.250 ~]#

linux安全手段

1 改名,强密码,改端口,开防火墙
2 组策略,ipsec策略

 
1、用chattr命令防止系统中某个关键文件被修改
# chattr +i /etc/fstab 
然后试一下rm mv rename等命令操作于该文件,都是得到Operation not permitted 的结果
2、让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作
# chattr +a /data1/user_act.log
3、不能修改root密码
lsattr /etc/passwd /etc/shadow
chattr -i /etc/passwd 
chattr -i /etc/shadow    再修改root的密码就可以
chattr +i /etc/passwd
chattr +i /etc/shadow

策略与手段
1.对目录设置粘滞位限定用户只能对自己的文件进行处理 stick bit
2.对文件设置setuid可以让执行该命令的用户以该命令拥有者的权限去执行,setuid使用不是无限制的。出于安全目的,只能应用在Linux  ELF格式二进制文件上,而不能用于脚本文件。
3.防止某个文件被修改  chattr
4.安全分区与只读分区  mount -o remount,noexec,ro
5.root无法远程登录    手段有三个
6.操作机,机房与公司,全部通过公钥认证,避免密码泄漏
7.一律在win中cmd界面,用命令,这样不会有记录



想限制root在指定终端登录。如下做后,无法登录。
1、在 /etc/pam.d/sshd  添加  auth            required        pam_securetty.so
2、在/etc/securetty 中添加
pts/0
pts/1
依然无法用root登录ssh服务器。
PS:我的系统是arch。注释掉/etc/pam.d/sshd中的 pam_securetty.so,可以登录。

vim /etc/ssh/sshd_config
#PermitRootLogin yes
找到这一行,去掉注释。
改为
PermitRootLogin no
service sshd restart

我们经常使用SSH登录管理服务器,在享受便利的同时也会遇到一些安全隐患,最常见的就是SSH密码被暴力破解。如果我们将SSH密码设置的过于复杂,又不容易记,因此限制SSH登录方式,只能使用key登录是一个不错的选择,既可以保证安全性,又非常方便。具体的修改方式如下:
1、添加信任key,并测试能否不通过密码直接登录
    将公钥信息加入用户目录的SSH认证key文件下。(linux下可以用ssh-keygen命令生成,windows下可以用SecureCRT等工具生成)
    比如,将如下格式的公钥信息拷贝到/root/.ssh/authorized_keys
     ssh-rsa AAAAB3.....H+5w== hujiankang@qiyi.com
    此时,带有对应私钥的机器就已经拥有了访问该机器root账户的权限。
    
    完成配置后,请采用带对应私钥的机器访问服务器,如果不提示输入password,直接登录,则证明配置正确。
 
2、修改SSH配置文件并重启SSH服务
    SSH配置文件的位置:/etc/ssh/sshd_config
    找到其中的两个参数配置:
PasswordAuthentication
ChallengeResponseAuthentication
    将这两个参数值修改为no:
PasswordAuthentication no
ChallengeResponseAuthentication no
    然后重启SSH服务。
# service sshd restart
    现在我们就已经限制用户的SSH登录方式,只允许用key方式登录。
    进一步测试,如果我们用一台不带信任key的机器尝试登录,那么会提示如下信息。
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    证明限制SSH登录方式成功。



可以说sudo命令补偿了它的一个致命缺陷,那就是任何一个想转为root用户的人都得掌握root用户的密码

linux安全设置

1.删除所有那些不能在你系统上使用的默认用户和组账户: lpsync,shutdown,halt, news, uucp, operator, games, gopher

2.ROOT自动从shell注销,编辑你的配置文件”vi /etc/profile”,在某个地方加入如下行,
“HISTFILESIZE=”
TMOUT=3600
我们为变量”TMOUT=”输入的这个值使用秒表示的、代表一个小时(60*60=3600秒)。如果你将此行加入你的“/etc/profile” 文件,那么在一小时的
非活动状态之后将要系统里的所有用户自动注销。你可以在用户私人的”.bashrc”文件里面设置这个变量,可以在一个确定的时间以后自动注销他们。

3.禁止并且卸载所有没有用的服务
你必须禁止一切卸载所有你不用的的服务,那样的话,你就能少担心一些。看看你的”/etc/inetd.conf”文件,用注释的方法禁用(在一行的开始加个#),
然后给inetd进程发送一个SIGHUP命令去更新到当前的”inetd.conf”文件。这样做:
第一步把”/etc/inetd.conf”更改许可权限成600,那样的话,就只有root可以读和写。
[Root@kapil /]# chmod 600 /etc/inetd.conf
第二步确保”/etc/inetd.conf”的所有者是root。
第三步编辑inetd.conf文件(vi /etc/inetd.conf),并且禁止一些服务,就像:ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等,
除非你打算用它。关闭这些服务就降低一些风险。
第四步给你的inetd进程发送一个HUP信号
[root@kapil /]# killall -HUP inetd
第五步设置”/etc/inetd.conf”文件为不可更改,使用 chattr 命令,这样的话,没人能修改那个文件。简单的设置文件为不可更改,执行如下命令:
[root@kapil /]# chattr +i /etc/inetd.conf
这将防止对”inetd.conf”文件的任何更改(意外的更改或者其他更改)。只有超级用户root能设置或者清除这个文件属性。修改inetd.conf 简单的取消不可更改的设置,执行如下命令:
[root@kapil /]# chattr -i /etc/inetd.conf

4.免疫”/etc/services”文件
你必须免疫 “/etc/services” 文件,防止未经授权的删除、增加服务。
免疫 “/etc/services” 文件,使用命令:
[root@kapil /]# chattr +i /etc/services

5.禁止Control-Alt-Deletc键盘关机命令
在你的”/etc/inittab”文件里面注释掉如下的行(用一个”#”)。
编辑inittab文件(vi /etc/inittab),
更换:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
读入:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
现在,按照如下提示输入,让更改生效:
[root@kapil /]# /sbin/init q

6.为脚本文件整理”/etc/rc.d/init.d”下的权限
整理脚本文件的许可权限,可靠的开始和结束所有你需要在引导时运行的常态进程,这样做:
[root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
这意味着只有root可以被允许读,写,和执行目录里面的脚本文件。

7.隐藏你的系统信息
默认状态下,当你登录到linux机器时,他告诉你Linux分布商的名字,版本,核心版本和服务器名字。这对一个骇客来说从你的服务器得到这些信息足够了,所以必须立刻用一个”Login:”提示符提示用户。
  第一步
  这样做,编辑”/etc/rc.d/rc.local”文件,放置”#”在如下行的前面。
  # This will overwrite /etc/issue at every boot. So, make any changes you
  # want to make to /etc/issue here or you will lose them when you reboot.
  #echo “” >; /etc/issue
  #echo “$R” >;>; /etc/issue
  #echo “Kernel $(uname -r) on $a $(uname -m)” >;>; /etc/issue
  #
  #cp -f /etc/issue /etc/issue.net
  #echo >;>; /etc/issue
  第二步
  然后,删除如下文件:在”/etc/”目录下的”issue.net” 和 “issue”:
  [root@kapil /]# rm -f /etc/issue
  [root@kapil /]# rm -f /etc/issue.net

8.禁止未用的 SUID/SGID 程序
  一个常规用户如果设置为SUID root,将能够作为root运行程序。一个系统管理员必须最小化使用这些 SUID/GUID程序,而且禁止那些不需要的程序。
  第1步
  从root拥有的程序里发现所有有`s’位的程序,用此命令:
  [root@kapil]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ;
  在被选中的程序上禁止suid 位,键入如下命令:
  [root@kapil /]# chmod a-s [program]
  
9.关闭ipv6
  vi /etc/modprobe.conf,在文件中添加以下两行
  alias net-pf-10 off
  alias ipv6 off
我怎样才能区分程序是否使用了PAM验证?
  使用ldd命令,如果这个程序的使用的动态连接库没有libpam和libpam_misc,那它肯定不使用PAM验证。然而,还有可能已经包含这两个库了,但是因为某些问题,程序无法正常工作。因此需要更好的方法来测试。
  对于需要使用PAM的程序,需要在/etc/pam.d目录中为其设置配置文件。配置文件的名字被编写进程序源代码中,通常和程序的名字是一样的,但不总是这样。例如:有个程序叫作pamprog,它的PAM配置文件是/etc/pam.d/pamprog。在配置文件中,只有下面两行: 
	auth required pam_permit.so
	auth required pam_warn.so
  现在对其进行测试。第一行,表示所有的用户都允许通过;第二行表示想syslog中写入一条警告信息。如果测试成功,就表示程序能够使用PAM进行验证。然后你可以在配置文件中加入更为复杂的验证功能。


[root@84-monitor ~]# ldd /usr/bin/passwd|grep pam
        libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fdfac008000)
        libpam.so.0 => /lib64/libpam.so.0 (0x00007fdfab620000)
[root@84-monitor ~]# ldd /bin/login|grep pam
        libpam.so.0 => /lib64/libpam.so.0 (0x00007f7d4c9d8000)
        libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f7d4c7d0000)
[root@84-monitor ~]# ldd /usr/sbin/sshd|grep pam
        libpam.so.0 => /lib64/libpam.so.0 (0x00007f20629b8000)
[root@84-monitor pam.d]# ldd /usr/sbin/crond|grep pam
        libpam.so.0 => /lib64/libpam.so.0 (0x00007f6095e38000)

原文地址:https://www.cnblogs.com/createyuan/p/4292521.html