Monthly Archives: 六月 2017

六月 30th, 2017

微信群的用户添加逻辑是 —— 当群人数达到100人后,用户无法再通过扫描群二维码加入,只能让用户先添加群内联系人微信,再由联系人把用户拉进来。这样,联系人员的私人微信会添加大量陌生人,给其带来不必要的打扰,而且纯人工操作,也容易出现纰漏。

那么,是否可以通过代码,做一个自动拉群机器人呢? 由微信机器人来实现自动加群功能,一劳永逸解决人工拉群的麻烦。

当然可以!@西秦公子 就用Python 创造了一个微信自动拉群机器人,并把它部署运行在UCloud云平台上。

现在,他把机器人构建过程及代码 都分享了出来,一起来看看吧~

 

我们在 UCloud 上运行了 Linux中国 的翻译平台,同时,最近我们的另外一个项目 运维密码发展迅猛,体验群很快就达到了 100 人,达到了 100 人后,就没有办法让用户通过扫描二维码来加群,只能让用户加我们的微信,然后由我们来把用户拉群。这样十分不便,而且也容易出现纰漏。

于是我们便考虑在云主机上,运行一个微信机器人,由微信机器人来实现加群,免去手动拉群的麻烦。具体实现过程如下:

代码实现

我们的核心需求主要是两个:

  1. 读取用户添加好友的验证信息
  2. 根据验证信息,发送不同的邀请链接

首先,我们要去创建一个机器人的实例,代码如下

  1. from wxpy import *
  2. bot = Bot('bot.pkl',console_qr=True)

这两行代码引入了 wxpy ,并生成了一个 bot 实例。这个实例会将我们的登录信息保存到 bot.pkl 中,这样我们在短时间内的机器人重启时,就不用重复登录了。

接下来,我们定义一个函数来校验用户的验证信息中,是否有我们需要的关键词。

  1. '''
  2. 验证信息
  3. '''
  4. def valid_msg(msg):
  5. return '运维密码' in msg.text.lower()

并且定义一个方法,用来邀请用户加入到我们的运维密码工作群中。

  1. '''
  2. 定义邀请用户的方法
  3. '''
  4. def invite(user):
  5. group = bot.groups().search('“运维密码”体验群')
  6. group[0].add_members(user, use_invitation=True)

这个里面的关键是我们要使用 botgroups 方法来获取到所有的用户,并使用搜索,取到我们想要的数据。

在这里我是使用了数据的 第一个结果,当然,你也可以在搜索时,使用 ensure_one 方法来保证只返回一个结果,而不是一个数组。

找到我们要邀请的用户以后,就可以使用 groupadd_members 方法来邀请用户加入到群聊。由于我们的群已经到了 100人的限制。所以这里将第二个参数设置为 true

上述的两个方法,我们基本完成了我们需要使用的部分。

接下来,我们就要让机器人来自动处理我们的请求消息了。

  1. '''
  2. 处理加好友信息
  3. '''
  4. @bot.register(msg_types=FRIENDS)def new_friends(msg):
  5. user = msg.card.accept()
  6. if valid_msg(msg):
  7. invite(user)
  8. else:
  9. user.send('Hello {},你忘了填写加群口令,快回去找找口令吧'.format(user.name))

这里最关键的是第一行的 @bot.register(msg_types=FRIENDS),这行代码是指注册一个监听器,来监听类型是 FRIEDNS 的消息,也就是加好友的消息。

然后定义了一个新的函数 new_friends(msg),在这个函数里,我们定义 user 为接受了用户的信息,并获取他的身份信息。

并且调用 valid_msg 的方法来判断添加好友的信息是否存在,如果返回的结果为真,就调用邀请用户的方法。

部署到 UCloud

接下来我们尝试将项目部署到 UCloud 云主机上:

创建主机

  1. 注册 UCloud – 专业云计算服务商
  2. 点击左侧的 云主机,然后点击 创建主机
  3. 右侧选择 付费方式,点击 立即购买
  4. 在支付确认页面,点击 确认支付

购买成功后回到主机管理列表,如下所示:

这里注意记住你的外网 IP,下面的 IP 替换成你的。

基础环境安装

由于我们的主机运行的是 CentOS 7.2 ,自带的是 Python 2.7.5 ,而 wxpy 需要运行在 Python 3 下,所以我们首先进行的是 Python 3 的安装。

执行如下命令来安装 Python 3

  1. yum install epel-release
  2. yum install python34

接下来安装 pip

  1. yum install python34-setuptools
  2. easy_install-3.4 pip

安装完成 Python 3 和 pip ,接下来我们就可以开始安装 wxpy 了

在命令行中执行

  1. pip3 install -i https://pypi.doubanio.com/simple/ -U wxpy

至此,就完成了基础环境搭建工作,机器人实现代码就可以顺利运行在此云主机上了。

代码复盘及设计理念解析

以上就是微信拉群机器人的全部实现过程,最终效果如下图:

就微信机器人来说,最关键的,是要对机器人接受到的信息注册监听器。通过监听消息的类型、消息的内容,来执行对应的操作。

比如我监听的事 FRIENDS 消息,同样的也可以监听好友消息等等。通过不同的监听模式来实现我们的具体功能是核心。如果我们把代码精简一下,最终的代码就是

  1. #!/usr/bin/env python3
  2. # coding: utf-8
  3. from wxpy import *
  4. bot = Bot()
  5. @bot.register(msg_types=FRIENDS)
  6. def new_friends(msg):
  7. 处理好友逻辑代码

最少的情况下只需要这些代码,就足够我们启动机器人了。当然,这样并不是最佳实践,代码的可读性还有待提高。

如果你有更好的实践思路,也欢迎同我沟通。

 

转载自: https://zhuanlan.zhihu.com/p/26277794  作者: 西秦公子

六月 30th, 2017

Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。

面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。

下面是对面向对象的一种理解,基于分类。

 

相近对象,归为类

在人类认知中,会根据属性相近把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都在鸟类的原型基础上的。

面向对象就是模拟了以上人类认知过程。在Python语言,为了听起来酷,我们把上面说的“东西”称为对象(object)。

 

先定义鸟类

class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'

我们定义了一个类别(class),就是鸟(Bird)。在隶属于这个类比的语句块中,我们定义了两个变量,一个是有羽毛(have_feather),一个是生殖方式(way_of_reproduction),这两个变量对应我们刚才说的属性(attribute)。我们暂时先不说明括号以及其中的内容,记为问题1。

 

假设我养了一只小鸡,叫summer。它是个对象,且属于鸟类。使用前面定义的类:

summer = Bird()
print summer.way_of_reproduction

通过第一句创建对象,并说明summer是类别鸟中的一个对象,summer就有了鸟的类属性,对属性的引用是通过 对象.属性(object.attribute) 的形式实现的。

 

可怜的summer,你就是个有毛产的蛋货,好不精致。

 

动作

日常认知中,我们在通过属性识别类别的时候,有时根据这个东西能做什么事情来区分类别。比如说,鸟会移动。这样,鸟就和房屋的类别区分开了。这些动作会带来一定的结果,比如移动导致位置的变化。

这样的一些“行为”属性为方法(method)。Python中通过在类的内部定义函数,来说明方法。

复制代码
class Bird(object):
    have_feather = True
    way_of_reproduction = 'egg'
    def move(self, dx, dy):
        position = [0,0]
        position[0] = position[0] + dx
        position[1] = position[1] + dy
        return position

summer = Bird()
print 'after move:',summer.move(5,8)
复制代码

我们重新定义了鸟这个类别。鸟新增一个方法属性,就是表示移动的方法move。(我承认这个方法很傻,你可以在看过下一讲之后定义个有趣些的方法)

(它的参数中有一个self,它是为了方便我们引用对象自身。方法的第一个参数必须是self,无论是否用到。有关self的内容会在下一讲展开)

 

另外两个参数,dx, dy表示在x、y两个方向移动的距离。move方法会最终返回运算过的position。

在最后调用move方法的时候,我们只传递了dx和dy两个参数,不需要传递self参数(因为self只是为了内部使用)。

 

我的summer可以跑了。

 

子类

类别本身还可以进一步细分成子类

 

比如说,鸟类可以进一步分成鸡,大雁,黄鹂。

在OOP中,我们通过继承(inheritance)来表达上述概念。

复制代码
class Chicken(Bird):
    way_of_move = 'walk'
    possible_in_KFC = True

class Oriole(Bird):
    way_of_move = 'fly'
    possible_in_KFC = False

summer = Chicken()
print summer.have_feather
print summer.move(5,8)
复制代码

新定义的鸡(Chicken)类的,增加了两个属性:移动方式(way_of_move),可能在KFC找到(possible_in_KFC)

在类定义时,括号里为了Bird。这说明,Chicken是属于鸟类(Bird)的一个子类,即Chicken继承自Bird。自然而然,Bird就是Chicken的父类。Chicken将享有Bird的所有属性。尽管我只声明了summer是鸡类,它通过继承享有了父类的属性(无论是变量属性have_feather还是方法属性move)

 

新定义的黄鹂(Oriole)类,同样继承自鸟类。在创建一个黄鹂对象时,该对象自动拥有鸟类的属性。

 

通过继承制度,我们可以减少程序中的重复信息和重复语句。如果我们分别定义两个类,而不继承自鸟类,就必须把鸟类的属性分别输入到鸡类和黄鹂类的定义中。整个过程会变得繁琐,因此,面向对象提高了程序的可重复使用性。

(回到问题1, 括号中的object,当括号中为object时,说明这个类没有父类(到头了))

 

将各种各样的东西分类,从而了解世界,从人类祖先开始,我们就在练习了这个认知过程,面向对象是符合人类思维习惯的。所谓面向过程,也就是执行完一个语句再执行下一个,更多的是机器思维。通过面向对象的编程,我们可以更方便的表达思维中的复杂想法。

 

总结

将东西根据属性归类 ( 将object归为class )

方法是一种属性,表示动作

用继承来说明父类-子类关系。子类自动具有父类的所有属性。

self代表了根据类定义而创建的对象。

 

建立对一个对象: 对象名 = 类名()

引用对象的属性: object.attribute

 

 

文章来自网络博客:http://www.cnblogs.com/vamei

六月 30th, 2017

函数最重要的目的是方便我们重复使用相同的一段程序。

将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。

 

函数的定义

首先,我们要定义一个函数, 以说明这个函数的功能。

def square_sum(a,b):
    c = a**2 + b**2
    return c

这个函数的功能是求两个数的平方和。

首先,def,这个关键字通知python:我在定义一个函数。square_sum是函数名。

括号中的a, b是函数的参数,是对函数的输入。参数可以有多个,也可以完全没有(但括号要保留)。

我们已经在循环和选择中见过冒号和缩进来表示的隶属关系。

c = a**2 + b**2        # 这一句是函数内部进行的运算

return c               # 返回c的值,也就是输出的功能。Python的函数允许不返回值,也就是不用return。

return可以返回多个值,以逗号分隔。相当于返回一个tuple(定值表)。

return a,b,c          # 相当于 return (a,b,c)

 

在Python中,当程序执行到return的时候,程序将停止执行函数内余下的语句。return并不是必须的,当没有return, 或者return后面没有返回值时,函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。None多用于关键字参数传递的默认值。

 

函数调用和参数传递

定义过函数后,就可以在后面程序中使用这一函数

print square_sum(3,4)

Python通过位置,知道3对应的是函数定义中的第一个参数a, 4对应第二个参数b,然后把参数传递给函数square_sum。

(Python有丰富的参数传递方式,还有关键字传递、表传递、字典传递等,基础教程将只涉及位置传递)

函数经过运算,返回值25, 这个25被print打印出来。

 

我们再看下面两个例子

复制代码
a = 1

def change_integer(a):
    a = a + 1
    return a

print change_integer(a)
print a

#===(Python中 "#" 后面跟的内容是注释,不执行 )

b = [1,2,3]

def change_list(b):
    b[0] = b[0] + 1
    return b

print change_list(b)
print b
复制代码

第一个例子,我们将一个整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化。

第二个例子,我们将一个表传递给函数,函数进行操作,原来的表b发生变化。

对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)

但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递)

 

总结

def function_name(a,b,c):
    statement
    return something  # return不是必须的

函数的目的: 提高程序的重复可用性。

return     None

通过位置,传递参数。

基本数据类型的参数:值传递

表作为参数:指针传递

 

练习:

写一个判断闰年的函数,参数为年、月、日。若是是闰年,返回True

 

 

文章来自网络博客:http://www.cnblogs.com/vamei

六月 30th, 2017

循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。

 

for循环

for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。

基本构造是

for 元素 in 序列: 
    statement

 

举例来说,我们编辑一个叫forDemo.py的文件

for a in [3,4.4,'life']:
    print a

这个循环就是每次从表[3,4.4,’life’] 中取出一个元素(回忆:表是一种序列),然后将这个元素赋值给a,之后执行隶属于for的操作(print)。

 

介绍一个新的Python函数range(),来帮助你建立表。

idx = range(5)
print idx

可以看到idx是[0,1,2,3,4]

这个函数的功能是新建一个表。这个表的元素都是整数,从0开始,下一个元素比前一个大1, 直到函数中所写的上限 (不包括该上限本身)

(关于range(),还有丰富用法,有兴趣可以查阅, Python 3中, range()用法有变化,见评论区)

 

举例

for a in range(10):
    print a**2

 

while循环

while的用法是

while 条件:
    statement

while会不停地循环执行隶属于它的语句,直到条件为假(False)

 

举例

while i < 10:
    print i
    i = i + 1

 

中断循环

continue   # 在循环的某一次执行中,如果遇到continue, 那么跳过这一次执行,进行下一次的操作

break      # 停止执行整个循环

for i in range(10):
    if i == 2: 
        continue
    print i

 

当循环执行到i = 2的时候,if条件成立,触发continue, 跳过本次执行(不执行print),继续进行下一次执行(i = 3)。

for i in range(10):
    if i == 2:        
        break
    print i

当循环执行到i = 2的时候,if条件成立,触发break, 整个循环停止。

 

总结

range()

for 元素 in 序列:

while 条件:

continue

break

 

 

 

文章来自网络博客:作者:Vamei 出处:http://www.cnblogs.com/vamei

六月 29th, 2017

GNOME Shell概述中的搜索结果可能很快就会看起来有点整洁。作为今年Google夏季代码的一部分,GNOME Shell搜索列表的外观和布局的改进正在进行之中。

更新的设计,将从2015年的GNOME设计团队模型出发,更好地利用空间,为本地文件和文件夹结果提供更多信息,并使用较小的应用程序/结果图标,使列表更易于扫描。

Rares Visalom在他的博客上写道:“我正在努力修改这个错误,我可以高兴地说,这几乎完成了。一些微小的调整,它将看起来就像在图片中的那样。“

“还有一些关于添加转换的问题(但是到目前为止还没有确定),就是这样。我会很快写下另一篇文章,当搜索结果看起来就像模型!“

调整后的概览列表仅仅是今年“Google夏季编码”中几个与GNOME相关的更改之一。其他项目包括向GNOME Calendar添加经常性事件;在GNOME磁盘中添加修改和修复文件系统的选项;并在GNOME Games应用程序中添加对游戏手柄和键盘配置的支持。

TAGS: ,
六月 29th, 2017

这里说的是windows平台下的mysql,linux下本来也不用这么麻烦。

添加、删除服务:
管理员身份运行命令行
{mysql_home}\bin\mysqld –install mysql   /*注册mysql服务*/
{mysql_home}\bin\mysqld –remove mysql   /*注册mysql服务*/

启动、停止服务:管理员身份运行命令行 net start mysql 、net stop mysql

自定义配置:从my-small.ini、my-medium.ini、my-large.ini、my-huge.ini、my-innodb-heavy-4G.ini中选一个适当级别(从轻到重)的配置文件,拷贝成my.ini文件

配置自定义数据目录:在my.ini的[mysqld]节点下增加 basedir= D:/mysql-noinstall-5.5.50-win32 (根目录)、datadir= D:/mysql-noinstall-5.5.50-win32/data (数据文件存放目录),注意不能是\ ,必须是/

初始设定:
{mysql_home}\bin\mysql 不带参数进入是无法管理的,也看不到mysql database,{mysql_home}\bin\mysql -u root进入,use mysql;  即可对初始用户进行设定。
grant all on *.* to root@’%’ identified by “root” with grant option;  /*设定root密码并允许从任意主机访问*/

flush privileges;

设置字符集:

在my.ini的[client]下设置 default-character-set = utf8 ,即可使用命令行窗口正确导入utf-8编码的sql文件(前提是创建数据库时选的字符集也是uft-8),此时对应用来说都是正常的,然而在命令行窗口里显示的是乱码,因为windows命令行窗口不会对中文进行utf-8编码和解码。

同时在[mysqld]下设置 character-set-server=utf8,可使Java代码里的中文正确存取(前提也是创建数据库时选的字符集也是uft-8)。

六月 29th, 2017

1. 背景

* 在生产环境下,安全总是无法忽视的问题,数据库安全则是重中之重,因为所有的数据都存放在数据库中

* 当使用非加密方式连接MySQL数据库时,在网络中传输的所有信息都是明文的,可以被网络中所有人截取,敏感信息可能被泄露。在传送敏感信息(如密码)时,可以采用SSL连接的方式。

*  版本小于5.7.6时按照 MySQL 5.6 SSL配置的方式进行。

2. MySQL 连接方式

* socket连接

* TCP非SSL连接

* SSL安全连接

* SSL + 密码连接 [version > MySQL 5.7.5]

* SSL + 密码 + 密钥连接

3. SSL 简介

* SSL指的是SSL/TLS,其是一种为了在计算机网络进行安全通信的加密协议。假设用户的传输不是通过SSL的方式,那么其在网络中以明文的方式进行传输,而这给别有用心的人带来了可乘之机。所以,现在很多网站其实默认已经开启了SSL功能,比如Facebook、Twtter、YouTube、淘宝等。

wKiom1lRImDQaiP7AAByLO28Dk8429.jpg

4. 环境 [ 关闭SeLinux ]

* system 环境

1
2
3
4
5
6
7
8
[root@MySQL ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@MySQL ~]# uname -r
2.6.32-696.3.2.el6.x86_64
[root@MySQL ~]# getenforce 
Disabled

 

have_openssl 与 have_ssl 值都为DISABLED表示ssl未开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@MySQL ~]# mysql -p'123'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.18 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.18    |
+-----------+
1 row in set (0.00 sec)
mysql> show variables like 'have%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
+---------------+----------+
2 rows in set (0.02 sec)
mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.01 sec)
mysql> show variables like 'datadir';
+---------------+-------------------+
| Variable_name | Value             |
+---------------+-------------------+
| datadir       | /data/mysql_data/ |
+---------------+-------------------+
1 row in set (0.01 sec)

5. SSL配置

*  利用自带工具生成SSL相关文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@MySQL ~]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql_data
Generating a 2048 bit RSA private key
..........................................................................+++
.....+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
.......................................................................................................................................................................+++
...+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
.....................+++
...........................................+++
writing new private key to 'client-key.pem'
-----

* 查看生成的SSL文件

1
2
3
4
5
6
7
8
9
[root@MySQL ~]# ls -l /data/mysql_data/*.pem
-rw------- 1 root root 1679 Jun 24 20:54 /data/mysql_data/ca-key.pem
-rw-r--r-- 1 root root 1074 Jun 24 20:54 /data/mysql_data/ca.pem
-rw-r--r-- 1 root root 1078 Jun 24 20:54 /data/mysql_data/client-cert.pem
-rw------- 1 root root 1675 Jun 24 20:54 /data/mysql_data/client-key.pem
-rw------- 1 root root 1675 Jun 24 20:54 /data/mysql_data/private_key.pem
-rw-r--r-- 1 root root  451 Jun 24 20:54 /data/mysql_data/public_key.pem
-rw-r--r-- 1 root root 1078 Jun 24 20:54 /data/mysql_data/server-cert.pem
-rw------- 1 root root 1675 Jun 24 20:54 /data/mysql_data/server-key.pem

* 修改数据目录下生成的SSL文件所属用户与权限

1
2
3
4
5
6
7
8
9
[root@MySQL ~]# chown -v mysql.mysql /data/mysql_data/*.pem
changed ownership of `/data/mysql_data/ca-key.pem' to mysql:mysql
changed ownership of `/data/mysql_data/ca.pem' to mysql:mysql
changed ownership of `/data/mysql_data/client-cert.pem' to mysql:mysql
changed ownership of `/data/mysql_data/client-key.pem' to mysql:mysql
changed ownership of `/data/mysql_data/private_key.pem' to mysql:mysql
changed ownership of `/data/mysql_data/public_key.pem' to mysql:mysql
changed ownership of `/data/mysql_data/server-cert.pem' to mysql:mysql
changed ownership of `/data/mysql_data/server-key.pem' to mysql:mysql

* 查看生成的SSL文件

1
2
3
4
5
6
7
8
9
[root@MySQL ~]# ls -l /data/mysql_data/*.pem
-rw------- 1 mysql mysql 1679 Jun 24 20:54 /data/mysql_data/ca-key.pem
-rw-r--r-- 1 mysql mysql 1074 Jun 24 20:54 /data/mysql_data/ca.pem
-rw-r--r-- 1 mysql mysql 1078 Jun 24 20:54 /data/mysql_data/client-cert.pem
-rw------- 1 mysql mysql 1675 Jun 24 20:54 /data/mysql_data/client-key.pem
-rw------- 1 mysql mysql 1675 Jun 24 20:54 /data/mysql_data/private_key.pem
-rw-r--r-- 1 mysql mysql  451 Jun 24 20:54 /data/mysql_data/public_key.pem
-rw-r--r-- 1 mysql mysql 1078 Jun 24 20:54 /data/mysql_data/server-cert.pem
-rw------- 1 mysql mysql 1675 Jun 24 20:54 /data/mysql_data/server-key.pem

* 重启 MySQL 服务

1
2
3
[root@MySQL ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

* 连接MySQL 查看SSL开启状态

have_openssl 与 have_ssl 值都为YES表示ssl开启成功

1
2
3
4
5
6
7
8
mysql> show variables like 'have%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   |
| have_ssl      | YES   |
+---------------+-------+
2 rows in set (0.03 sec)

6. SSL + 密码连接测试

* 创建用户并指定 SSL 连接 [ MySQL 5.7后推荐使用create user 方式创建用户 ]

1
2
mysql> create user 'ssl_test'@'%' identified by '123' require SSL;
Query OK, 0 rows affected (0.00 sec)

* 通过密码连接测试 [ 默认采用SSL连接,需要指定不使用SSL连接 ]

1
2
3
[root@MySQL ~]# mysql -h 192.168.60.129 -ussl_test -p'123' --ssl=0
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'ssl_test'@'192.168.60.129' (using password: YES)

* 通过 SSL + 密码 连接测试

SSL: Cipher in use is DHE-RSA-AES256-SHA 表示通过SSL连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@MySQL ~]# mysql -h 192.168.60.129 -ussl_test -p'123'  --ssl
mysql: [Warning] Using a password on the command line interface can be insecure.
WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.18 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.18, for linux-glibc2.5 (x86_64) using  EditLine wrapper
Connection id:     12
Current database: 
Current user:      ssl_test@192.168.60.129
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:     stdout
Using outfile:     ''
Using delimiter:   ;
Server version:        5.7.18 MySQL Community Server (GPL)
Protocol version:  10
Connection:     192.168.60.129 via TCP/IP
Server characterset:   latin1
Db     characterset:   latin1
Client characterset:   utf8
Conn.  characterset:  utf8
TCP port:      3306
Uptime:         7 min 34 sec
Threads: 1  Questions: 29  Slow queries: 0  Opens: 112  Flush tables: 1  Open tables: 105  Queries per second avg: 0.063
--------------

7. SSL + 密码 + 密钥连接

* 创建用户并指定 X509 [ SSL+密钥 ] 连接 [ MySQL 5.7后推荐使用create user 方式创建用户 ]

1
2
mysql> create user 'X509_test'@'%' identified by '123' require X509;
Query OK, 0 rows affected (0.00 sec)

* 通过密码连接测试

1
2
3
[root@MySQL ~]# mysql -h 192.168.60.129 -uX509_test -p'123' --ssl=0
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'X509_test'@'192.168.60.129' (using password: YES)

* 通过 SSL +密码 连接测试

1
2
3
[root@MySQL ~]# mysql -h 192.168.60.129 -uX509_test -p'123' --ssl
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'X509_test'@'192.168.60.129' (using password: YES)

* 通过 SSL + 密码+密钥连接测试

SSL: Cipher in use is DHE-RSA-AES256-SHA 表示通过SSL连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@MySQL ~]# mysql -h 192.168.60.129 -uX509_test -p'123' --ssl-cert=/data/mysql_data/client-cert.pem --ssl-key=/data/mysql_data/client-key.pem 
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.7.18 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.18, for linux-glibc2.5 (x86_64) using  EditLine wrapper
Connection id:     21
Current database: 
Current user:      X509_test@192.168.60.129
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:     stdout
Using outfile:     ''
Using delimiter:   ;
Server version:        5.7.18 MySQL Community Server (GPL)
Protocol version:  10
Connection:     192.168.60.129 via TCP/IP
Server characterset:   latin1
Db     characterset:   latin1
Client characterset:   utf8
Conn.  characterset:  utf8
TCP port:      3306
Uptime:         18 min 27 sec
Threads: 1  Questions: 40  Slow queries: 0  Opens: 118  Flush tables: 1  Open tables: 111  Queries per second avg: 0.036
--------------
TAGS: ,
六月 29th, 2017

一、背景

wKioL1lUqleSzEgUAAHDoLn9BnU477.jpg

1、最打动我升级的就是3.0的扁平化页面的设计。

2、新版本主要做了如下的改进。

  • 提供Zabbix server,proxy和agent之间的加密和认证功能,基于PSK加密算法。如果对安全性要求高的用户就不再需要第三方工具或者VPN来实现加密了
  • 增加趋势预估功能
  • 可以在特定时间执行一些监控项目
  • 可以定义报警类别之间的依赖关系
  • 强制执行housekeeper
  • 性能得到改进

减小了poller配置缓存,优化了history缓存和history同步

通过引入in-memory缓存机制明显改善了action处理过程的性能

使用哈希机制改善trigger处理性能

限制数据库请求来提供nodata()函数的计算过程

  • Value缓存得到改善

二、升级步骤

Zabbix agent不强制升级到3.0.2,但是官方建议升级。Zabbix server和proxy必须升级到同一个版本。

为了在升级过程中尽量减少宕机时间和数据丢失,建议先停掉并升级Zabbix server,然后再一个接一个地停掉并升级proxy。当所有的proxy升级过后,再启动zabbix server。

1、停掉zabbix server

1
service zabbix_server stop

2、备份zabbix 数据库

1
mysqldump -uzabbix -pzabbix zabbix > zabbix20170629.sql

3、备份配置文件,php文件,zabbix二进制程序

1
2
3
mv /etc/zabbix /etc/zabbix24
mv /var/www/zabbix /var/www/zabbix24
mv /usr/local/zabbix /usr/local/zabbix24

4、安装新的zabbix server

请点击查看安装详情

三、安装3.0版本的WEB

因为最低需要的PHP版本为5.4,然后我们yum安装的版本是5.3.3,所以我们需要升级PHP。

1、升级PHP版本

1
2
3
4
yum remove php php-*  
rpm -Uvh http://repo.webtatic.com/yum/el6/latest.rpm
yum install php55w php55w-mysql php55w-mbstring -y
yum install php55w-bcmath php55w-gd php55w-libxml php55w-xml -y

2、修改PHP的参数

1
2
3
4
post_max_size = 128M
max_execution_time = 600
max_input_time = 600
date.timezone = Asia/Shanghai

3、复制WEB文件

一定要注意文件夹的所属及权限。

1
2
3
cp -a frontends/php /var/www/zabbix
chown apache.apache zabbix -R
service httpd restart

4、安装前端

浏览器打开设定的地址。

wKioL1lUoX2T9xVfAABcnfKHOXc196.jpg

确定好所以的版本都满足。

wKiom1lUoX3jjC17AACSwytSQJ4404.jpg

Enter details for connecting to the database. Zabbix database must already be created.

wKioL1lUoX6hxIfEAABsm0Ok1MA968.jpg

Enter Zabbix server details.

wKiom1lUoX6SCnAiAABXoTeh67c518.jpg

Review a summary of settings.

wKioL1lUoX7x1b_HAABqFm4KhlM648.jpg

Now,You can see the new page.

wKiom1lUoX-hDTnlAAFgHUR5Too322.jpg

附录:Zabbix Server的参数优化

  • CacheSize=200M        配置信息的缓存大小,用于存储host,item和trigger数据的共享内存大小。取值范围是128k~8G,默认是8M
  • CacheUpdateFrequency=60            zabbix执行配置缓存更新的时间间隔,默认是60秒
  • DebugLevel=3          指定日志级别,默认是3打印警告信息,4是调试信息,5是更加详细的调试信息
  • HistoryCacheSize=50M    用于存储历史数据的共享存储大小,默认是16M,可以取值范围是128K~2G
  • HistoryIndexCacheSize=8M  用于索引历史数据缓存中的历史数据的共享存储大小,缓存一个监控项目大约需要100字节。这个参数从3.0.0开始支持
  • HousekeepingFrequency=1  设置zabbix执行housekeeping的频率,默认是1小时。housekeeping操作时删除数据库中过期的数据。可以设置HousekeepingFrequency为0关闭自动housekeeping,然后手动执行housekeeper_execute来清理过期数据
  • MaxHousekeeperDelete=5000 在一个housekeeping任务中删除的过期数据数量不超过这个值
  • TrendCacheSize=20M       存储trend数据的共享内存大小
  • ValueCacheSize=10M       缓存监控数据的历史数据的共享内存大小。
TAGS: ,
六月 29th, 2017

系统环境:

系统:CentOS Linux release 7.2.1511 (Core)

GCC版本:gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

LNMP环境:

Nginx版本:1.10.2

PHP版本:PHP 7.1.0 (cli)

MySQL版本:5.7.16

php7安装路径:/usr/local/php7/

安装扩展之前先用pear设置php.ini的路径:

 

/usr/local/php7/bin/pear config-set php_ini /usr/local/php7/etc/php.ini

 

这样做的好处就是用pecl安装php扩展的时候,会自动在php.ini中引用扩展包,不用自己手动添加扩展包。

1、安装yaf扩展:

 

/usr/local/php7/bin/pecl install channel://pecl.php.net/yaf-3.0.4

 

安装完成之后会自动把yaf.so加入到php.ini中,不用自己手动添加扩展

2、安装yaconf扩展:

 

/usr/local/php7/bin/pecl install channel://pecl.php.net/yaconf-1.0.4

 

3、安装swoole扩展:

 

/usr/local/php7/bin/pecl install channel://pecl.php.net/swoole-1.9.1

 

4、安装redis扩展:

1、安装Redis服务:

 

安装教程详见:CentOS7安装Redis

2、安装扩展:

 

/usr/local/php7/bin/pecl install channel://pecl.php.net/redis-3.0.0

 

5、安装SeasLog扩展:

 

/usr/local/php7/bin/pecl install channel://pecl.php.net/SeasLog-1.6.8

 

6、安装memcache扩展:

1、首先安装memcache服务端memcached:

 

yum -y install libevent-devel

cd ~ && wget http://memcached.org/latest -O memcached-1.4.33.tar.gz

tar -zxvf memcached-1.4.33.tar.gz

cd memcached-1.4.33

./configure && make && make install

 

详细安装说明请见:Memcached官方说明,安装完成开始启动memcached:

 

memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root  -c 512 -P /var/run/memcached.pid

 

启动参数说明:

 

-d选项是启动一个守护进程,

-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了本机地址127.0.0.1

-p是设置Memcache监听的端口,我这里设置了默认的11211,最好是1024以上的端口,

-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,

-u是运行Memcache的用户,我这里是root,

-c选项是最大运行的并发连接数,默认是1024,我这里设置了512,按照你服务器的负载量来设定,

-P是设置保存Memcached的pid文件,我这里是保存在/var/run/memcached.pid

 

启动完成查看启动结果:

 

ps -ef | grep memcached

 

设置memcache开机启动:

 

echo -e ‘memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root  -c 512 -P /var/run/memcached.pid\n’ >> /etc/rc.local

 

2、安装memcache扩展:

 

Ⅰ、ⅣⅤ安装依赖库libmemcached:

 

cd ~ && wget https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz

tar -zxvf libmemcached-1.0.18.tar.gz

cd libmemcached-1.0.18/

./configure

make && make install

 

Ⅱ、安装扩展:

cd ~ && git clone https://github.com/php-memcached-dev/php-memcached.git

cd php-memcached/

git checkout php7

phpize

./configure –disable-memcached-sasl

make && make install && make test

 

Ⅲ、配置扩展:  在/etc/php.ini中加入以下内容:

extension=”memcached.so”

 

重启php:

 

kill -USR2 `cat /usr/local/php7/var/run/php-fpm.pid`

 

重启之后查看php是否已经正常加载:

 

php -m|grep memcached

 

如果输出:memcached则说明配置成功

TAGS: ,
六月 29th, 2017

出于安全考虑设置密码规则

设置密码到期的天数。
用户必须在天内更改密码。
此设置仅影响创建用户,而不会影响现有用户。
如果设置为现有用户,请运行命令“chage -M(days)(user)”。

PASS_MAX_DAYS   60         # 密码到期时间

PASS_MIN_DAYS   3          # 初始密码更改时间

PASS_MIN_LEN    8          # 密码最小长度

PASS_WARN_AGE   7          # 密码过期提示时间

重复密码限制使用

# vi /etc/pam.d/system-auth

# near line 15: prohibit to use the same password for 5 generation in past

password     sufficient     pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5

 

设置最小密码长度,用户不能设置小于此参数的密码长度

# set 8 for minimum password length

# authconfig –passminlen=8 –update# the parameter is set in a config below

# grep “^minlen” /etc/security/pwquality.conf

minlen = 8

 

在新密码中设置同一类的允许连续字符的最大数目

set 4 for maximum number of allowed consecutive characters of the same class

# authconfig –passmaxclassrepeat=4 –update# the parameter is set in a config below

# grep “^maxclassrepeat” /etc/security/pwquality.conf

maxclassrepeat = 4

 

在新密码中至少需要一个小写字符。

# authconfig –enablereqlower –update# the parameter is set in a config below# (if you’d like to edit the value, edit it with vi and others)

# grep “^lcredit” /etc/security/pwquality.conf

lcredit = -1

 

在新密码中至少需要一个大写字符

# authconfig –enablerequpper –update# the parameter is set in a config below

# (if you’d like to edit the value, edit it with vi and others)

# grep “^ucredit” /etc/security/pwquality.conf

ucredit = -1

 

在新密码中至少需要一个数字

# authconfig –enablereqdigit –update# the parameter is set in a config below

# (if you’d like to edit the value, edit it with vi and others)

# grep “^dcredit” /etc/security/pwquality.conf

dcredit = -1

 

密码包括至少一个特殊字符

# authconfig –enablereqother –update# the parameter is set in a config below

# (if you’d like to edit the value, edit it with vi and others)

# grep “^ocredit” /etc/security/pwquality.conf

ocredit = -1

 

在新密码中设置单调字符序列的最大长度。 (ex⇒’12345’,’fedcb’)

[root@linuxprobe~]# vi /etc/security/pwquality.conf# add to the end

maxsequence = 3

# 设置新密码中不能出现在旧密码中的字符数

# vi /etc/security/pwquality.conf# add to the end

difok = 5

 

检查来自用户passwd条目的GECOS字段的长度超过3个字符的字是否包含在新密码中。

# vi /etc/security/pwquality.conf# add to the end

gecoscheck = 1

 

设置不能包含在密码中的Ssace分隔的单词列表

# vi /etc/security/pwquality.conf# add to the end

badwords = denywords1 denywords2 denywords3

 

为新密码设置hash / crypt算法。 (默认为sha512)# show current algorithm

# authconfig –test | grep hashing

password hashing algorithm is md5# chnage algorithm to sha512

# authconfig –passalgo=sha512 –update

# authconfig –test | grep hashing

password hashing algorithm is sha512

 

TAGS: