寻觅生命中的那一片浅草......

每月存档 四月, 2016

setfacl设置多个用户或者组的权限

背景

过往,大家是root用户,scp/rz文件到远程机器,读写都没有问题,但目前大家都是用个人的普通账号去登录,需要scp/rz更新文件的时候,就比较麻烦:需要先scp/rz到一个临时目录,再通过sudo把文件mv过去

优化

方法一

如果客户端是Linux,比较好做,大不了写个脚本,把scp和mv的步骤都写进去,就可以了。

如果客户端是win,想通过rz上传,服务器端就需要先cd到临时目录,上传了,再通过sudo把文件mv过去。

方法二

不是好办法

chmod -R 777 xxx

方法三

这里再介绍一个方法:setfacl

大家都知道chown只能对一个用户和一个组设置权限,当遇到多组的情况,就处理不了,而setfacl则可以处理多用户,多组

# 先设置开启acl,CentOS系统,默认应该是支持的
# 但我之前遇到某云的系统,defaults挂载参数,却需要再添加acl才可以
mount -o acl /data

# 设置johncan组对test_acl可以读写,这里可以设置任意多个组
cd /data/backup/tmp
setfacl -m g:johncan:rwx -R test_acl/

# 获取权限
getfacl test_acl/

# 以下为输出内容
# file: test_acl/
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
group:johncan:rwx
mask::rwx
other::rwx

SVN服务器升级

一、问题

  • SVN仓库通过Apache发布出来,为了增强安全性,还使用了https,Subversion版本是subversion-1.6.11-12.el6_6.x86_64
  • pre-commit等钩子有做一些检查,如果有问题就echo错误信息,但出错信息是中文的,svn客户端无法显示,提示如下
Error output could not be translated from the native locale to UTF-8.

这个问题持续了大概有3-4年的时间了,虽然在出错后,可以问问旁边的同事是什么原因,但始终不够直观,我们尝试过以下方法,但都没有解决

  • 修改pre-commit的编码,修改LANG
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
  • 修改Apache的编码
AddDefaultCharset UTF-8
  • 采用http发布,而不是https

我们最终得出的结论是:网上的解决方案只对svn://这种直接用svnserve发布出来的仓库才有效

二、 终极解决方案

Subversion 1.8特性

前天,项目组又问起这个事,就Google了下, 发现Subversion 1.8之后,加了一个新的特性

SVNUseUTF8 On

它的作用就是使得Apache的mod_dav_svn模块,在和pre-commit等钩子通讯的时候,使用utf-8编码,可以参考mod_dav_svn

升级

我们系统是CentOS 6.2,比较简单,有个第三方,走了Subversion 1.8的rpm包,yum即可,主要是更新了2个rpm包

  • subversion-1.8.15-1.x86_64
  • mod_dav_svn-1.8.15-1.x86_64

具体升级操作

cat > /etc/yum.repos.d/wandisco-svn.repo <<EOF
[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/\$basearch/
enabled=1
gpgcheck=0
EOF

yum install subversion

修改httpd.conf并重启httpd

<IfModule mod_dav_fs.c>
    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb
    SVNUseUTF8 On
</IfModule>

/etc/init.d/httpd graceful

升级后的测试

需要做些测试,确保升级后不会有问题,测试列表如下

  • commit
  • update
  • log
  • merge
  • copy签出版本

注意问题

客户端版本

服务器版本是1.8,如果客户端是1.6,则只能checkout,不能update,1.7没有问题,建议客户端至少1.8

CentOS 5上的svn 1.8

WandiscoSVN也提供了5.5上的升级,但无法满足我们的场景的需求,主要是因为CentOS5上提供的openssl是0.9.8版本,不支持SNI,所以需要手动安装

完整的安装脚本,可以参考我们svn上的脚本

install_svn_1.8.sh

svn合并无法记录mergeinfo的问题

# 在svn服务器上执行
sudo svnadmin upgrade svn_repos_dir

详细参考:svn合并无法记录mergeinfo的问题

GPU并行计算学习

因为好奇,想学点新东西,所以有了一点断断续续的测试,还有本文

GPU有多强

以Nvidia GT 740为例,500块左右,有384个核,而目前台式机,强劲的i7也只有4核8线程啊,所以显卡非常适合做并行计算。

对于服务器级别的,如Nvidia的K或者M系列,核数则可以去到2000-4000,当然价格也比较感人,上万块。

再来看一点亲测的数据,一个6位包含小写字母和数字的Linux密码,用CPU和GPU去破解,他们之间的耗时

# GPU
time ./john --format=sha512crypt-opencl ~/passwordsdb
# CPU
time ./john ~/passwordsdb
处理器 时间(分钟)
GPU 34
CPU 170

应用领域

目前已经有云供应商提供GPU计算服务,我们大概可以把GPU运算应用于

  • 各种Crack
  • 深度学习,如Caffee
  • 挖矿

并行计算标准

  • CUDA,Nivia only,官网提供了Win、Linux、MAC全平台的工具包
  • OpenCL,苹果推出,兼容Nivdia、AMD、Intel,据查资料,部分ARM架构的GPU也支持

Kali

大名鼎鼎的安全发行版,版本是「kali-linux-2016.1-amd64.iso」

安装Nivdia工具

apt-get -y install nvidia-cuda-toolkit libssl-dev 
# 列出显卡
nvidia-smi -L
# 以下为上面的指令输出
GPU 0: GeForce GT 740 (UUID: GPU-8c5c127a-1628-f75e-bde2-61b202fe83b3)

如果安装不成功,也可以参考下面的文档继续折腾下,在线安装比较卡,推荐另外一个源

Install NVIDIA Drivers on Kali

vim /etc/apt/sources.list
#中科大kali源  推荐,快
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free

安装JohnTheRapper

john比较智能,不需要指定密码组成字符集就可以运行,它会先用single-mode,然后是wordlist with rules,最后是incremental mode

Kali自带John,但不支持GPU,所以需要手工安装一个

# 需要用github上的最新版,否则编译报错
cd /dist/src
git clone https://github.com/magnumripper/JohnTheRipper.git
cd JohnTheRapper
# 默认不开启CUDA,需要显式开启,不过意义不大,因为在OpenCL下比CUDA更快
./configure --enable-cuda
make -s -j 5
cd ../run

列出OpenCL设备

# 列出OpenCL设备
./john --list=opencl-devices
Platform #0 name: NVIDIA CUDA, version: OpenCL 1.2 CUDA 7.5.23
    Device #0 (0) name:     GeForce GT 740
    Device vendor:          NVIDIA Corporation
    Device type:            GPU (LE)
    Device version:         OpenCL 1.2 CUDA
    Driver version:         352.79 [recommended]
    Native vector widths:   char 1, short 1, int 1, long 1
    Preferred vector width: char 1, short 1, int 1, long 1
    Global Memory:          1023.10 MB
    Global Memory Cache:    32.0 KB
    Local Memory:           48.0 KB (Local)
    Max memory alloc. size: 255.2 MB
    Max clock (MHz):        1058
    Profiling timer res.:   1000 ns
    Max Work Group Size:    1024
    Parallel compute cores: 2
    CUDA cores:             384  (2 x 192)
    Speed index:            406272
    Warp size:              32
    Max. GPRs/work-group:   65536
    Kernel exec. timeout:   yes
    PCI device topology:    01:00.0

列出CUDA设备

./john --list=cuda-devices
CUDA runtime 7.0, driver 7.5 - 1 CUDA device found:

CUDA Device #0
    Name:                          GeForce GT 740
    Type:                          discrete
    Compute capability:            3.0 (sm_30)
    Number of stream processors:   384 (2 x 192)
    Clock rate:                    1058 Mhz
    Memory clock rate (peak)       2500 Mhz
    Memory bus width               128 bits
    Peak memory bandwidth:         80 GB/s
    Total global memory:           1023.10 MB
    Total shared memory per block: 48.0 KB
    Total constant memory:         64.0 KB
    L2 cache size                  256.2 KB
    Kernel execution timeout:      Yes
    Concurrent copy and execution: One direction
    Concurrent kernels support:    Yes
    Warp size:                     32
    Max. GPRs/thread block         65536
    Max. threads per block         1024
    Max. resident threads per MP   2048
    PCI device topology:           01:00.0

测试破解密码

Linux

不同版本的Linux,所用加密方式不一样,可以用下面的指令查看Linux系统的加密方式

grep ^ENCRYPT_METHOD /etc/login.defs
# 输出
ENCRYPT_METHOD SHA512
# 将用户名和hash后的密码整合下
unshadow /etc/passwd /etc/shadow > ~/passwordsdb
# OpenCL
./john --format=sha512crypt-opencl ~/passwordsdb
# CUDA
./john --format=sha512crypt-cuda ~/passwordsdb
# 再次查看破解后的密码
./john --show ~/passwordsdb

普通MD5

# GPU
time ./john --format=raw-MD5-opencl ~/md5_password.txt
time ./john --format=raw-MD5 ~/md5_password.txt

MAC

去官网找到对应的dmg下载安装即可,有一个CUDA-Z的工具,可以检测到CUDA设备

测试破解

# 密码构成字符集
echo -n 'abcdefghijklmnopqrstuvwxyz0123456789' > charsets/charsetall
# md5后的密码
echo -n 'e99a18c428cb38d5f260853678922e03' > test_hashes/Hashes-MD5.txt
# 开始破解
./Cryptohaze-Multiforcer  -h MD5 -c charsets/charsetall -f test_hashes/Hashes-MD5.txt --min=4 --max=9

其他

Kali上的信息查看工具

glxinfo

如果glxinfo提示direct rendering为yes说明显卡3D加速已经激活

glxinfo |grep -i 'direct rendering'
# 以下为输出内容
direct rendering: Yes

nvidia-settings

可以看到很详细的信息,包括GPU核心数,当前负载

apt-get install nvidia-settings
# 直接运行
nvidia-settings

请看图

参考文档

ChatOps:Hubot和BearyChat简介

目标

快速做到任何有网的地方可以处理

背景说明

  1. 我们部分服务是内网的,也就是出了公司就无法处理,或者需要打开电脑,需要vpn,相对来说,有一点不方便
  2. 一个功能开发是需要时间的,例如一个审批流程,涉及逻辑,界面,测试
  3. 假设我们现在有个git仓库,代码提交后,我们希望做一些事情,但前提是在做之前,需要人工审核下提交的内容,如何可以做到不用开电脑,不用vpn,用一台手机就可以快速地进行处理?BearyChat就可以,如果需要更强大,更方便,可以整合Hubot

BearyChat的2个机器人

BearyChat自带了2个机器人,Incoming和Outgoing,现在让我们来看看如何用他们来把我们的审核流程串起来

  1. 注册BearyChat,进去后,添加一个讨论组,例如叫abc
  2. 去到机器人管理,添加Incoming机器人,给它一个名字,例如叫chathubot,选择发给它的内容要转发到哪里,我们选择发送到abc,这时会得到一个hook地址,还有说明文档,我们拿到hook地址
  3. 在git里部署hook,和svn一样,git钩子分2种:客户端和服务器端,本例中,比较理想是用服务器端的post-receive,但查了资料,gitbucket并不支持服务器端钩子,那本例中只能用post-commit这个本地钩子,钩子代码见下面
  4. 此时,git提交的diff内容和版本号已经发送到abc讨论组了,我们来设置Outgoing,设置名字后,设置“触发词”和“POST地址”,就是定义在聊天里发送了什么内容,触发BearyChat这个Outing机器人,向“POST地址”提交内容。我们设置触发词为「!upgit」,post地址为我们httpsqs的地址
  5. 我们安装BearyChat客户端或者在网页端,选择abc讨论组,发送「!upgit 1ae4082」,「1ae4082」为本次git提交的版本号,这时机器人就会把一段信息发送到httpsqs,发送的消息内容见下文
  6. 从httpsqs获取内容并做操作,好像没什么好说的了

post-commit

#!/usr/local/bin/python2.7
#-*- encoding:UTF-8 -*- 
# johncan 2016-04-03 17:32:17

import sys  
reload(sys)
sys.setdefaultencoding('utf8')

import commands
import requests
import json

incommint_url='https://hook.bearychat.com/xxxx'
git_ci_content = commands.getoutput('/usr/bin/git log -1 -p pre-commit')

payload = {"text":git_ci_content}

headers = {'content-type': 'application/json'}
r = requests.post(incommint_url, data=json.dumps(payload), headers=headers)
# print r.content

Outgoing机器人post的消息内容参考

{
    "channel_name": "abc",
    "subdomain": "xxxx",
    "text": "!upgit 1ae4082",
    "token": "xxxx",
    "trigger_word": "!upgit",
    "ts": 1459824707044,
    "user_name": "xxxx"
}

和Hubot整合

这个对于我们目前的需求来说,不是必须的

安装Hubot

一些说明

  1. 环境说明:CentOS 6.2 64bit
  2. Hubot很多东西都是通过环境变量来设置
# 设置debug模式
export HUBOT_LOG_LEVEL="debug"
# 设置监听端口
export EXPRESS_PORT=8081

开始安装

yum install nodejs npm redis -y
# 此处请修改redis安全配置,然后启动redis
# 网上也有资料说不用redis也可以
/etc/init.d/redis start
npm install -g coffee-script hubot yo generator-hubot
# 比较奇怪,用root初始化hubot会出错,下面用普通用户初始化hubot
useradd bchubot
su - bchubot
sudo mkdir /data/bchubot
cd /data
sudo chown bchubot.bchubot bchubot
cd bchubot
yo hubot
npm install hubot-bearychat --save

BearyChat添加Hubot

去到机器人管理,添加Hubot,这里会生产一个Token,复制Token

启动hubot

export HUBOT_BEARYCHAT_TOKENS='token_from_bearycaht'
export EXPRESS_PORT=8081
/data/bchubot/bin/hubot -a bearychat

BearyChat填写Hubot地址

http://hubot_ip:hubot_port/

此时可以测试发送消息给hubot,测试指令精选

# hubot会回PONG
ping
# 会发送一张gif的http地址
pug me

Hubot的动作是需要用coffee-sctipts写的,没有深入研究

其他

hubot的启动

网上很多资料都说可以直接运行hubot就可以跟它聊天,我测试是不行的,campfire是它的默认插件,所以,最简单的应该是这个指令

hubot -a campfire

post提交数据类型

如果data中含有换行符和&等字符,需要用这种方式发,当时在这里耗了一天的时间

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}

r = requests.post(url, data=json.dumps(payload), headers=headers)

更多可以参考Requests的文档

一个用Hubot做发布的案例

湾区日报的第一个“员工”:Slack/Hubot

2016年四月
« 3月   5月 »
 123
45678910
11121314151617
18192021222324
252627282930