分类目录归档:安全运维

在Ubuntu上配置PPTP VPN服务器

With a PPTP server, you can setup a VPN server easily. Having a virtual private network is beneficial to both individual users and businesses alike.

This tutorial explains how you can install a PPTP server on Ubuntu. The steps are generic, they should apply to almost all versions of Ubuntu.

Step 1: Installing pptpd

The first thing that we need to do is, naturally, install pptpd.

apt-get install pptpd

Installing PPTPD is that easy! Now we need to actually setup the PPTP server.

Step 2: Adding users

We don’t want everyone to be able to access our VPN of course; because of this, you can create users so that only the users with the correct password will be able to access your VPN. To add users, edit the file:

/etc/ppp/chap-secrets

The format is:

[username] [service] [password] [ip]

Username and password are pretty straightforward, service and IP are not though. Service is usually pptpd. If you just want to setup a VPN, use pptpd for the service – it will work. If you want to restrict the IP that a user can login from, you can use his/her IP. If you want connections from that account to be made from all IPs, you can use *.

Sample:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
user001 * password001 *
user002 pptp password002 *
user003 * password001 123.123.123.123
# The first * means you can use both pptpd and l2tpd

Step 3: Edit the pptpd settings

There are a few things that we need to edit. Start by editing the following file:

/etc/pptpd/pptpd.conf

Look for the localip and remoteip settings. Remove the # (comment character) for both so that these settings will actually be recognized. Change localip to your server IP. If you don’t know your server IP, use ifconfig command

ifconfig

The remoteip is basically the IP range that clients (computers that are connected to your VPN) will be assigned. For example, if you want the following IP range: 192.168.120.231-235, your VPN server will be able to assign 192.168.120.232, 192.168.120.233, 192.168.120.234, and 192.168.120.235 to clients. It’s up to you what you want to use for this field.

Step 4: Update sysctl.conf

Find the line net.ipv4.ip_forward in the sysctl.conf file. We need to uncomment this line, so open the following file:

/etc/sysctl.conf

Make sure that it says net.ipv4.ip_forward=1, and not net.ipv4.ip_forward=0.

Then make changes active:

sysctl -p

Step 5: Restarting pptpd

At this point, everything will work. Restart pptpd.

service pptpd restart

Congratulations, you now have a PPTP server!

Ref:

ImageMagick远程代码执行漏洞

漏洞描述:

据ImageMagick官方,目前程序存在一处远程命令执行漏洞(CVE-2016-3714),当其处理的上传图片带有攻击代码时,可远程实现远程命令执行,进而可能控制服务器,此漏洞被命名

ImageTragick。ImageMagick是一款开源图片处理库,支持PHP、Ruby、NodeJS和Python等多种语言,使用非常广泛。包括PHP imagick、Ruby rmagick和paperclip以及NodeJS imagemagick等多个图片处理插件都依赖它运行。可能的影响范围包括各类流行的内容管理系统(CMS)。

影响影响范围:

  1. 调用ImageMagick的库实现图片处理和渲染的应用。
    ImageMagick 为多种语言提供了api,具体可参考http://www.imagemagick.org/script/api.php
  2. 很多流行的内容管理系统(CMS)使用了ImageMagick ,例如 WordPress 的图片处理插件已被证实存在远程命令执行的漏洞(Author 及以上权限用户执行)。其他例如MediaWiki、phpBB和vBulletin 使用了ImageMagick 库生成缩略图,还有一些程序如LyX使用ImageMagick转换图片格式。以上应用可能受到此漏洞影响。
  3. 如果通过shell 中的convert 命令实现一些图片处理功能,也会受到此漏洞影响。

漏洞等级:高危

漏洞验证方法:

若系统中安装使用了ImageMagick,本地执行如下命令:

convert 'https://example.com"|ls "-la' out.png

若ls -la 命令成功执行,说明存在漏洞。未执行ls 命令,并报错,说明不受影响。
修复建议(临时):

  1. 由于远程命令执行时,命令代码是包含在图片中上传的,所以在图片上传时需要对图片内容进行检验。
  2. Linux临时防护方案 :编辑 /etc/ImageMagick/policy.xml ,在 之间增加以下几行
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" /> 
<policy domain="coder" rights="none" pattern="HTTPS" /> 
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />

漏洞曝出后,我在公司的Thumbor服务器上运行了测试指令,发现返回如下:

20160509103029

ls -la命令被成功执行,即存在漏洞。按修复方案执行后,返回错误。修复成功。

20160509103218

自动化运维工具Ansible使用(三)

ad-hoc模式基本使用

ansible在使用ad-hoc模式执行命令时,相当于使用SSH连接各个服务器并在服务器上执行命令。格式为:

ansible <host-pattern> [options]

一个典型的ansible ad-hoc命令格式为:

ansible <host> -m module -a 'command' -f forks
# eg
ansible group-a -a 'date'
ansible all -m service -a 'name=mysql state=restarted'

上面给出了两个例子,第一个例子为在group-a组中所有服务器上执行date命令;第二个例子为在所有服务器上执行service mysql restart命令。

第一个例子只是简单的执行命令,这里不多介绍。而在第二个例子中,我们使用了ansible自带的service模式,这个模式中提供了restart选项,这样我们就可以直接使用这个命令来重启服务。

ansible自带的模式有很多,可以通过以下命令查看当前ansible支持的模块:

ansible-doc -l

逻辑运算

ansible对host的控制支持逻辑运算,举例如下:

目的:在group-a和group-b上执行date命令

ansible group-a:group-b -a 'date'

目的:在group-a和group-b上排除site-1执行date命令

ansible 'group-a:group-b:!site-1' -a 'date'

常用模块

下面用一些实例介绍比较常用的几个模块:

copy模块:

目的:把主控端/root目录下的a.sh文件拷贝到到指定节点上

ansible 111.111.111.111 -m copy -a 'src=/root/a.sh dest=/tmp/'

file模块:

目的:更改指定节点上/tmp/t.sh的权限为755,属主和属组为root

ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root"

cron模块:

目的:在指定节点上定义一个计划任务,每隔3分钟到主控端更新一次时间

ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 122.122.122.122"'

service模块:

目的:重启指定节点上的 mysql 服务

ansible all -m service -a 'name=mysql state=restarted'

script模块:

目的:在指定节点上执行/root/a.sh脚本(请注意,这个脚本存放在Server端而不是Client端)

ansible site-1 -m script -a '/root/a.sh'

ping模块:

目的:检查指定组机器是否还能连通

ansible group-a -m ping

command模块:

目的:在指定组服务器上运行git pull命令

ansible group-all -m command -a 'git pull origin master chdir=/srv/www/{{ domain }}'

get_url模块:

目的:在制定服务器上执行wget操作

ansible site-3 -m get_url -a 'url=http://www.google.com/favicon.ico dest=/tmp'

synchronize模块:

目的:同步Server和Client内容。将Server的/root/a目录推送到指定节点的/tmp目录下

ansible site-5 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'

这里有几个参数可以使用:

mode=pull 更改推送模式为拉取模式
delete=yes 使两边的内容一样(即以推送方为主)
compress=yes 开启压缩,默认为开启
--exclude=.git 忽略同步.git结尾的文件

拉取

 目的:将site-3节点的/tmp/a目录拉取到主控节点的/root目录下
 命令:ansible site-3 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'

 查看进程:

目的:查看远程主机的httpd进程

ansible storm_cluster -m shell -a "ps -ef | grep httpd"
ansible storm_cluster -m raw -a "pa -ef | grep httpd"

以上就是一些常用的模式的使用,其他的模块和具体的说明信息见这里:Ansible Documentation – All Modules

参考:Ansible – exclude host from playbook execution

locale警告信息修复

在维护系统后,忽然出现了这样一条和语言相关的系统警告信息:locale: Cannot set LC_ALL to default locale: No such file or directory。在进行各种操作的时候时不时的就跳出来。

于是,我开始查错,首先看看系统的locale配置:

root@localhost:~# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US:
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=

提示LC_ALL无法找到。看配置中确实这一栏为空。然后查询一下系统已经安装的locale:

root@localhost:~# locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

发现了一个明显的问题,配置中的zh_CN.UTF-8并没有安装。于是安装:

sudo locale-gen zh_CN.UTF-8

问题解决。

网上还有一些其他的解决方法和问题原因说明,我没尝试过但是应该有参考价值:

http://www.360doc.com/content/14/0428/16/17044736_372964025.shtml

http://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue

insserv错误解决办法

今天使用apt-get安装命令时突然系统报的如下错误。Google未果,之前有人遇到了类似错误但是最后也并没有解决。

insserv: Starting redis depends on rc.local and therefore on system facility `$all' which can not be true!
insserv: Starting redis depends on rc.local and therefore on system facility `$all' which can not be true!
insserv: Starting redis depends on rc.local and therefore on system facility `$all' which can not be true!
insserv: Max recursions depth 99 reached
insserv:  loop involving service bootmisc at depth 8
insserv: exiting now without changing boot order!
update-rc.d: error: insserv rejected the script header

错误内容为超过了最大搜索深度99,看样子像是一个由死循环带来的错误。但是并不知道错误的具体原因。只是在错误中反复出现redis和rc.local。这里我就想到,可能是由于Redis的启动项问题。因为redis是我自己编译安装的,配置使用的也是自己的配置文件。

为了解决问题,我先使用sysv-rc-conf工具去掉redis的开机启动:

sysv-rc-conf

再次重新使用apt-get安装程序,发现已经能够正常安装。看来确实是由于redis的配置引发的问题。

于是,删除redis,默认的redis配置在/usr/local/bin/中

cd /usr/local/bin
rm redis-*
apt-get install redis-server

重新安装后,问题解决。

MySQL开启root用户远程登陆

首先注释掉mysql配置文件(my.cnf、mysql.conf等)中的bind-address字段

#bind-address: 127.0.0.1

之后,进入数据库,对root用户赋权

mysql -u root -p
> use mysql;
> grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option;
> flush privileges;