管理Ubuntu用户

List All Users

查看用户信息:

1
2
3
$ more /etc/passwd
root:x:0:0:root:/root:/bin/bash
fan:x:1000:1000:,,,:/home/fan:/bin/bash

用户信息文件分析(每项用:隔开)

1
2
3
4
5
6
7
8
例如:fan:x:1000:1000:,,,:/home/fan:/bin/bash
fan  	//用户名 
x  	//口令、密码 
1000  	//用户id(0代表root、普通新建用户从500开始)
1000  	//所在组 
,,,  	//描述 
/home/fan  	//用户主目录 
/bin/bash  	//用户缺省Shell

How To Add a User

新增用户

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
# add a new user
$ sudo adduser gfw
Adding user `gfw' ...
Adding new group `gfw' (1001) ...
Adding new user `gfw' (1001) with group `gfw' ...
Creating home directory `/home/gfw' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for gfw
Enter the new value, or press ENTER for the default
	Full Name []: gfw
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: proxy
Is the information correct? [Y/n] y

# login as the new account
$ su - gfw
Password: 
gfw@iZu1lw5glrvZ:~$ 

# change password for the new account
$ passwd gfw
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

How To Grant a User Sudo Privileges

设置账户权限

由于上文中的gfw账户仅用作建立ssh端口转发,不需要拥有管理系统的权限,所以不应该有系统管理(sudo)的权限。

Ubuntu默认新增的用户是没有sudo权限的,所以不需要做任何额外的动作。

如果需要用户系统管理的权限,可以使用visudo命令,详见参考资料2.

参考资料:

  1. http://man.linuxde.net/passwd

  2. https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04-vps

Written with StackEdit.

使用Squild搭建HTTP正向代理

由于老婆回国后,还想继续使用Gmail。之前一直用的Goagent貌似也因为大部分的Google App Engine(GAE) IP地址被屏蔽,大部分情况下没法正常使用,Github上的项目也已经停止维护。

网上搜索到的的其他的免费代理,又总感觉不安全。

所以就想自己搭建一个HTTP代理服务器,方便家人使用。

下载安装

我的代理服务器是搭在硅谷的阿里云上,服务器版本是Ubuntu 14.4 LTS,直接使用apt-get下载安装。

1
2
# installation
$ sudo apt-get install squid

更改配置(可选)

安装完成之后,Squid3已经被注册为Linux系统服务,运行在后台了。

只不过基于Squid3默认的配置,只允许本地Localhost使用该代理,并且监听3128端口作为HTTP 代理。

可以通过修改配置文件,修改监听端口,增加访问控制等。

不过对于本次翻墙的需求,完全使用的是默认的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 配置文件路径
$ sudo vi /etc/squid3/squid.conf

# HTTP监听端口
http_port 61112

# 基于IP地址的权限控制
# 将请求源地址为31.149.197.0 ~ 31.149.197.255的计算机归类为yourownclient组
acl yourownclient src 31.149.197.0/24

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
# 允许yourownclient组的请求使用该代理服务器
http_access allow yourownclient

# Shutdown squid3 
$ sudo service squid3 stop

$ sudo chromium-browser --proxy-server="47.88.xxx.xxx:61112"

建立加密通道

但是仅仅使用代理服务器, 由于请求内容是明文,依然会被GFW拦截掉。 想想我大天朝为了愚民,也真是煞费苦心啊。

所以需要在客户机与代理服务器之间,建立一条加密通道。

一般的推荐的方案是: Squid + Stunnel

  1. openssl生成证书
  2. 在服务器端,使用Squid搭建代理
  3. 使用第一步生成的证书,监听HTTPS端口
  4. 在客户端,安装Stunnel,使用同样的证书加密数据。
  5. 由Stunnel监听本地端口,将请求加密后请求至Squid代理服务器。

缺点是:

  • 需要在客户端安装Stunnel,并且还有修改配置。 对于我老婆这种电脑盲来说,还不如要了她的命。

所以我选择了使用SSH端口转发的方式,来构建加密通道,与第一种方式的不同在于:

  1. 不需要下载配置Stunnel
  2. 下载SSH客户端Putty.exe
  3. 将如下命令保存为批处理文件Gfw.bat start putty.exe -L 8888:127.0.0.1:3128 gfw@47.88.XX.XX -pw 123456
  4. 运行gfw.bat,即可建立加密通道

缺点也很明显:

Written with StackEdit.

Python笔记:PBKDF2算法

PBKDF2算法是不可逆加密算法的一种,广泛的用于存储用户密码的系统中。

由于之前的系统有密码重发的功能,就是将用户的临时密码再发送一次,所以之前在存储用户密码时,使用的是可逆的加密算法。

客户的技术人员知道后,紧急提了一个变更,要求将用户密码修改为不可逆的加密算法。

MD5

作为最常用的不可逆加密算法,在早期的系统中很多密码都是通过MD5加密存储的。

还记得上大学期间,多数小网站管理比较混乱,也不经常升级系统,给系统打补丁。每当DISCUZ等论坛有漏洞爆出来后,甚至可以通过baidu找到还在使用旧版本的网站。

一通倒腾之后,就把论坛的数据库down下来了。 打开之后,往往看到的就是用MD5加密后的用户密码。

由于算法是不可逆的,所有当时有很多MD5加解密的网站,用户每加密一个字符串,就会将明文与密文存储成字典,时间一长,很大一部分的密文都可以找出对应的明文。

PBKDF2算法

想要避免MD5的问题,最简单方式就是在MD5加密时,将明文加上一段随机生成的盐值(Salt),保证即使是同样的用户密码,由于盐值的存在,也会加密出不同的密文。

但是随之而来,又有了hash碰撞等新的攻击方式被密码学家发现,MD5算法几乎是不安全的了。

目前比较推荐的hash算法就是PBKDF2算法。 可以这样理解,PBKDF2就是将密码加随机盐值,通过SHA加密算法,运算数万次。

PBKDF2算法已经被集成在Python的hashlib库中,帮助文档如下:

pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key

Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as pseudorandom function.

hash_name:指定算法(SHA1…SHA512)
password: 密码明文
salt: 盐值
iterations: 运算次数
dklen: 密文长度

简单验证如下:

1
2
3
4
5
6
7
8
9
>>> import hashlib
>>> import binascii
>>> dk = hashlib.pbkdf2_hmac('sha1', b'password', b'salt', 1)
>>> binascii.hexlify(dk)
b'0c60c80f961f0e71f3a9b524af6012062fe037a6'

>>> dk = hashlib.pbkdf2_hmac('sha512', b'mypassword', b'1234567890123456', 50000)
>>> binascii.hexlify(dk)
b'9f0be6c4b6c4ce7624a920316a768eef19dcf506770962f4cb0cc8161bd56dcd65105cb909c07a58bd604b5c2637ce77d4eccb6ef4c53d069509d9b7e82963b4'

参考资料:

  1. 关于存储用户密码的思考,bcrypt 和 PBKDF2算法
  2. 如何安全的存储用户的密码

Written with StackEdit.