2014年3月

Windows清理多余右键菜单方法

清理桌面右键菜单

点击开始输入 regedit 并回车,在注册表中依次展开下面的分支:

HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers

根据你要删除的菜单名称,猜测要删除的分支,比如我要删除 Git 的菜单,就删除 Git *** 之类的分支就好了。其他比如QQ的发送到手机,你就找到包含“QQ”的分支删除就好。

去除Office 2010的右键“共享文件夹同步”菜单

打开注册表,删除以下的注册表项~

HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\XXX Groove GFS Context Menu Handler XXX

HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\XXX Groove GFS Context Menu Handler XXX

HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\XXX Groove GFS Context Menu Handler XXX

HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\XXX Groove GFS Context Menu Handler XXX

HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\XXX Groove GFS Context Menu Handler XXX

删除多余的发送到选项

首先设置 文件夹选项 -显示隐藏的文件、文件夹和驱动器

Win7的“发送到”选项保存在如下位置:

C:\Users[当前登录的用户名]\AppData\Roaming\Microsoft\Windows\SendTo

也可直接打开资源管理器,在地址栏中输入:

%APPDATA%\Microsoft\Windows\SendTo

直接删除你不想要的即可。

解决grub 载入win7时"error: no argument specified"问题

昨天update了kali,今天启动电脑在grub载入win7的时候报错了,是老问题以前遇到过,随手记录下。

报错信息:

error: no argument specified
Press any key to continue

解决办法:
1、赋予编辑权限

root@kali:~# ls -l /boot/grub/grub.cfg
-r--r--r-- 1 root root 4638  3月 21 11:10 /boot/grub/grub.cfg
root@kali:~# chmod +w /boot/grub/grub.cfg
root@kali:~# ls -l /boot/grub/grub.cfg
-rw-r--r-- 1 root root 4638  3月 21 11:10 /boot/grub/grub.cfg
root@kali:~# vim /boot/grub/grub.cfg

2、找到如下代码,并增加红色部分代码

menuentry "Windows Vista (loader)" {
set root=(hd0,msdos1)
search --no-floppy --fs-uuid --set=root 4E441C6F441C5BD1
chainloader +1
}

3、取消编辑权限

root@kali:~# cat /boot/grub/grub.cfg
root@kali:~# chmod -w /boot/grub/grub.cfg
root@kali:~# ls -l /boot/grub/grub.cfg
-r--r--r-- 1 root root 4643  3月 21 11:18 /boot/grub/grub.cfg

先cat下看下有没修改成功,然后撤掉w权限。

Linux服务器安全配置之IPtables+fail2ban

《Linux服务器安全配置》系列
Linux服务器安全配置之MySQL
Linux服务器安全配置之用户管理
Linux服务器安全配置之SSH


Iptables能够提供数据包过滤、网络地址转换(NAT)等功能。配合fail2ban自动管理iptables配置,过滤非法ip。

一、IPtables安装配置

1、首先确定你的系统已经安装Iptables.打开SSH终端,输入

whereis iptables

如果能看到如下类似信息,说明你已经安装了iptables

iptables: /sbin/iptables /usr/share/iptables /usr/share/man/man8/iptables.8.gz

如果不是这个提示,或者没有任何提示,那你的Debian上可能没有安装iptables。请使用如下命令安装:

sudo apt-get install iptables

注意:本文所有命令在普通帐号下完成,本普通帐号使用sudo具有root权限,不建议直接使用root用户

2、查看Iptables目前的配置信息

可以使用如下命令查看

sudo iptables -L

如果你是第一次安装配置iptables,你可能会看到如下结果:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

这个结果,也就是防火墙充许所有的请求,就如没有设置防火墙一样.

3、配置Iptables

我们先把一个基本的Iptables的规则文章保存起来,这个规则文章做为测试用

sudo vi /etc/iptables.test.rules

然后在这个文章中输入如下规则内容,这个内容是debian官方给出的基本配置

*filter
 
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
 
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
 
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
 
# Allows SSH connections for script kiddies
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
 
# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.
 
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 
# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
 
# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

保存本文件,然后把本规则加载,使之生效,注意,iptables不需要重启,加载一次规则就成了

sudo iptables-apply /etc/iptables.test.rules

然后再查看最新的配置,应该所有的设置都生效了.

sudo iptables -L

4、保存生效的配置,让系统重启的时候自动加载有效配置
iptables提供了保存当前运行的规则功能

iptables-save > /etc/iptables.up.rules

注意,如果当前用户不是root,即使使用了sudo,也会提示你没有权限,无法保存,所以执行本命令,你必须使用root用户.可以使用sudo -i快速转到root,使用完成,请及时使用su username切换到普通帐户.

为了重启服务器后,规则自动加载,我们创建如下文件:

vi /etc/network/if-pre-up.d/iptables

内容如下:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

最后,设置本文章具体可执行仅限

chmod +x /etc/network/if-pre-up.d/iptables

二、fail2ban安装配置

sudo apt-get install fail2ban

1、配置fail2ban日志轮循

vi /etc/logrotate.d/fail2ban

写入:

/var/log/fail2ban.log {
    weekly
    rotate 7
    missingok
    compress
    postrotate
      /etc/init.d/fail2ban restart 1>/dev/null || true
    endscript
}

2、修改配置文件

/etc/fail2ban/
目录action.d下的文件指定满足条件时执行的一些动作,比如使用iptables禁止ip访问。
目录filter.d下的文件定义匹配日志的正则表达式。
fail2ban.conf文件是配置fail2ban-server程序启动的一些参数
jail.conf文件包含filter及action的指定。
每个conf文件可被local文件覆盖,conf文件第一个被读取,接着是读取local文件,所以local文件中定义的参数会覆盖conf中的参数。所以我们不需要添加所有的内容到local文件,只需要添加conf文件中你想覆盖的部分参数就好。

$ vi /etc/fail2ban/jail.local

[vsftpd-iptables]
enabled = true
filter = vsftpd
action = iptables[name=VSFTPD, port=ftp, protocol=tcp]
sendmail-whois[name=VSFTPD, dest=you@mail.com]
logpath = /var/log/secure
maxretry = 3
[ssh-iptables]
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
           sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com]
logpath  = /var/log/secure.log
maxretry = 5

enabled:可选值false,true
filter:指定/etc/fail2ban/filter.d/目录下的正则文件,如filter = sshd则是指定/etc/fail2ban/filter.d/sshd.conf。
action:指定执行的动作,具体动作文件在/etc/fail2ban/action.d目录下。
logpath:指定监控日志的路径。
maxretry:执行action匹配的次数。

接着重启fail2ban

$ sudo service fail2ban restart

[ ok ] Restarting authentication failure monitor: fail2ban.

查看iptables更新

$ sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-SSH  tcp  --  anywhere             anywhere             tcp dpt:ssh
fail2ban-VSFTPD  tcp  --  anywhere             anywhere             tcp dpt:ftp
fail2ban-ssh-ddos  tcp  --  anywhere             anywhere             multiport dports ssh
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-SSH (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-VSFTPD (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-ssh-ddos (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

三、IPtables+fail2ban过滤web扫描

常用语法摘录

过滤检查语法测试

fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/vsftpd.conf

通过iptables命令查看被封掉的IP

iptables -L -nv

也可以通过下在的命令查看

fail2ban-client status vsftpd-iptables
Status for the jail: vsftpd-iptables
|- filter
| |- File list: /var/log/secure
| |- Currently failed: 0
|- Total failed: 6- action
|- Currently banned: 1
|- IP list: IP
|- Total banned: 1

注:如果重启了iptables 记得一定还要重启fail2ban,不然他就不能生效,fail2ban的过滤表是在iptables 启动后在加入的。

在/etc/fail2ban/filter.d/目录下建立nginx-Scan.conf文件保存

[Definition]
failregex = <HOST> -.*- .*HTTP/1.* 404 .*$
ignoreregex =

过滤原理是通过查找一定时期内访问结果为404 的所有IP,并通过定义下面的条件,找出符合该规则的IP。

打开/etc/fail2ban/jail.local配置文件,在其最后加入下面的内容:

[nginx-Scan]
enabled = true
port = http,https
filter = nginx-Scan //对应上面过滤规则中我们新建的nginx.conf文件
logpath = /logs/nginx/scan.access.log //日志文件位置
maxretry = 20 //失败多少次后就封掉IP
findtime = 60 //在多少时间内,查找符合规则的IP
bantime = 3600 //禁止该IP多长时间
action = iptables[name=HTTP, port=http, protocol=tcp]
ignoreip = 192.168.1.2 //白名单中的IP

通过fail2ban-regex命令,查看符合规则的IP :

fail2ban-regex /logs/nginx/scan.access.log /etc/fail2ban/filter.d/nginx-Scan.conf

注:以上结果是从日志中批配nginx.conf规则的数,并未对jail.local文件中的规则进行匹配 。

查看被封IP列表

fail2ban-client status nginx-get-dos
或 iptables -nL

参考文章

夜空Blog

securing-a-linux-server

使用fail2ban防止暴力破解ssh及vsftpd密码

http://www.dedmeet.com/software-projects-mainmenu-12/fail2ban-to-limit-ddos-attacks-on-webserver.html

http://www.361way.com/fail2ban-nginx/1825.html

http://beeznest.wordpress.com/2012/06/08/anti-nginx-dos-filter-for-fail2ban-4/

http://snippets.aktagon.com/snippets/554-how-to-secure-an-nginx-server-with-fail2ban

Linux服务器安全配置之SSH

上篇我们讲了服务器用户管理方面的安全配置,接下来这篇讲解下SSH的安全配置。

1、修改默认端口:默认Port为22,并且已经注释掉了;修改是把注释去掉,并修改成其它的端口,1024-65535并且未被使用的。

2、禁止root从ssh登陆

PermitRootLogin no
StrictModes yes

3、禁止空密码登录

PermitEmptyPasswords no

4、仅允许SSH协议版本2

SSH协议有两个版本,仅使用SSH协议版本2会更安全,SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。

编辑/etc/ssh/sshd_config文件并查找下面这样的行:

Protocol 2,1 修改为 Protocol 2

5、SSH高级配置——使用RSA公钥认证登录

使用RSA公钥认证可以预防你的系统遭受字典攻击,因为你不需要用登录名和密码登录SSH服务,而是一对RSA密钥,一个公钥和一个私钥。在本地机器上生成并保存私钥,将公钥传到服务器上。当你发起一个SSH登陆会话时,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接登录shell,不再要求密码。如果它们不匹配,你的连接将会被自动断开。

服务器端配置如下

vi /etc/ssh/sshd_config
# 确认以下设置
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

完成后保存退出。接着在登录用户home目录下创建文件夹(.ssh)和文件(authorized_keys)

mkdir ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys

将需要登录远程服务器的主机(就是你自己电脑)生成的公钥复制到里面。可以有多个公钥,一行一个。公钥中含有空格时,请注意不要让编辑器自动换行。保存退出后,设置文件权限:

chmod 600 ~/.ssh/authorized_keys

然后,重启 sshd

sudo service ssh restart

接下来重点讲解下客户端(就是我们自己电脑)如何生成RSA密钥对。

1、Linux——用ssh-keygen生成

root@kali:/home# ssh-keygen -b 1024 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ec:a6:0e:f7:d2:f3:e6:19:d5:6e:1a:ae:xx:xx:xx:xx root@kali
The key's randomart image is:
+--[ RSA 1024]----+
|                 |
|                 |
|                 |
|       .     .   |
|        S.  E .  |
|       .. .o .   |
|    . ..ooo.. o  |
|     o.++.++ +   |
|     .ooo==oo    |
+-----------------+

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),不建议设置口令。如果担心私钥的安全,可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
这时再输入下面的命令,将公钥传送到远程主机host上面:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

如果更改过SSH监听端口,则使用命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 10022 user@server"

好了,从此你再登录服务器,就不需要输入密码了。

如果执行后显示

Permission denied (publickey).

,则需要修改服务器/etc/ssh/sshd_config文件

PasswordAuthentication no
# no改为yes

2、windows系统客户端——用puttygen生成

win下远程登录linux服务器需要使用putty这个工具,为了免密码登录需要先用puttygen工具生成公私钥对。(文末提供工具下载链接

1).设置密钥类型和密钥位数

设置密钥类型和密钥位数

2).点击“生成”开始生成密钥对

点击“生成”开始生成密钥对

3).保存生成的密钥对

保存生成的密钥对

至此成功生成公私钥对,接下来要手动操作把公钥发给服务器管理员,让其把公钥加到登录用户home下的authorized_keys末尾。

4).在putty中载入ppk结尾的私钥

在putty中载入ppk结尾的私钥

来张图,成功登录。

成功登录

参考文章:

SSH原理与运用(一):远程登录

Linux ssh 使用深度解析(key登录详解)

Linux 服务器与 PuTTY 客户端配置指南

Linux服务器安全配置之用户管理

以 Debian/Ubuntu 系统为例说明,使用 CentOS/RedHat 系统会有差异

添加用户、用户组

首先,添加一个用户组(这里假定为admin用户组)。

addgroup admin

然后,添加一个新用户(假定为bill)。

useradd -d /home/bill -s /bin/bash -m bill 

上面命令中,参数d指定用户的主目录,参数s指定用户的shell,参数m表示如果该目录不存在,则创建该目录。

接着,设置新用户的密码。

passwd bill 

将新用户(bill)添加到用户组(admin)。

usermod -a -G admin bill 

接着,为新用户设定sudo权限。

visudo 
如果提示命令未找到,则执行

apt-get install sudo

进行安装。

visudo命令会打开sudo设置文件/etc/sudoers 找到下面这一行。

root    ALL=(ALL:ALL) ALL

在这一行的下面,再添加一行。

root    ALL=(ALL:ALL) ALL
bill    ALL=(ALL) NOPASSWD: ALL

上面的NOPASSWD表示,切换sudo的时候,不需要输入密码,我喜欢这样比较省事。如果出于安全考虑,也可以强制要求输入密码。

root    ALL=(ALL:ALL) ALL
bill    ALL=(ALL:ALL) ALL

然后,先退出root用户的登录,再用新用户的身份登录,检查到这一步为止,是否一切正常。

exit
ssh bill@128.199.209.xxx

sudo配置

一定要禁用 root 账号,使用 sudo 代替。

接下来讲下配置步骤

1.安装sudo(如果安装过则跳过)

apt-get install sudo

一般来说 ubuntu 系统会默认安装好 sudo 并配置好第一个用户账号为 sudoer。一些 VPS 定制版本可能未设置这一步。请立即安装 sudo 提升系统安全。

2.检查/etc/sudoers文件

cat /etc/sudoers

请确保有下列行:

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

即 admin 组账号有 sudo 权限。

不同系统默认sudo权限组不同(即不一定是admin),检查方法:cat /etc/group

然后将指定的用户,比如 username 加入 admin 组:

usermod -a -G admin username

完成后,可以使用 id username 查看用户组。然后,退出 root 账号,使用 username 登录,使用 sudo -i 升权为 root。

确认无误后,请立即删除 root 账号的密码

sudo passwd -d root

要再次启用root,重新设置其密码即可:

sudo passwd root
passwd命令详解
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。

下篇:Linux服务器安全配置之SSH