分类目录归档:Linux

对linux的研究

在Apache上使用客户端证书认证

前阵子在nginx上做了客户端证书认证,发现满足感大大的有,于是一发不可收拾,在RaspberryPi上的Apache也做了一个。

上参考:

http://www.adintr.com/article/blog/192

http://httpd.apache.org/docs/2.2/mod/mod_ssl.html

 

首先,第一步是做证书。

这部分是老生常谈了,懒人表示继续在路由上用easyrsa做(参考1参考2),写了一份server的key和crt之后就可以拿来用了。(之前我有CA证书和客户端证书了)

然后到手3个文件, server.key server.crt ca.crt。

修改/etc/apache/sites-available/default-ssl

找到这些字段

SSLCertificateFile
SSLCertificateKeyFile
SSLVerifyClient
SSLCACertificateFile
SSLVerifyClient

去掉注释之后,分别填上 server.crt的位置,server.key的位置,”on”,ca.crt的位置,”require”,就像这样

SSLEngine on
SSLCertificateFile    /etc/apache2/certs/pi.crt
SSLCertificateKeyFile /etc/apache2/certs/pi.key
SSLCACertificateFile /etc/apache2/certs/ca.crt
SSLVerifyClient require

配置也完成了。

然后启用一下ssl的mod和这个默认的ssl配置,就是分别做一下软连接。

最后启动/重启apache服务器,好了,看到浏览器问你要证书了。

在Nginx中使用客户端证书认证

其实这个东西很久以前就想搞的了,一直没动手,直到最近总在外面跑,有时候就考虑连回家里,于是稍微动了一下手。

选nginx是因为这个服务器够轻型,做前端最好了,而且做前端的话以前也做过,有经验。

上连接:

http://blog.csdn.net/kunoy/article/details/8239653



http://blog.csdn.net/jinhill/article/details/2573777
签证书什么的感觉略微有点麻烦了,于是果断的用了openvpn的easyrsa,这套脚本帮我很轻松的完成了证书的签署。主要用到了build-ca build-key-server build-key,根据名字就看出来了,生成ca证书,生成服务器证书,生成私有证书。这部分根据不用的系统,生成的证书在不同的位置,详情再自行Google之。我是在openwrt上做的,签好的证书在/etc/easyrsa/keys下。

如果真心想认真学习签证书的话还是去做多点的Google吧。

证书和密钥到手,这时候比较推荐导出一下客户端证书,使用以下命令

openssl pkcs12 -export -inkey client.key -in client.crt -CAfile ca.crt -chain -out client.pfx

就能得到一份可以导入的私有证书了。(暂时我只找到这种笨办法)

 

证书都准备好之后就是服务器的配置了。

先要处理一下openssl.conf,主要是这几行

dir            = /etc/easy-rsa/keys         # top dir  
database       = $dir/index.txt          # index file.  
new_certs_dir  = $dir/newcerts           # new certs dir  

certificate    = $dir/ca.crt         # The CA cert  
serial         = $dir/serial             # serial no file  
private_key    = $dir/ca.key  # CA private key  
RANDFILE       = $dir/.rand      # random number file 

countryName = match  
stateOrProvinceName = match  
organizationName = match  
organizationalUnitName = match  
localityName            = optional  
commonName              = supplied  
emailAddress            = optional

上半部分是证书文件的位置,下半部分是认证哪些内容是相同,自己看着修改。

openssl弄好之后就是重头戏了,nginx本身的配置。

默认的配置文件里有https服务器的实例,参照着就能弄好一个认证服务器端证书的,只要稍微加上几行就能加上私有证书的认证了。

    # HTTPS server

    server {
        listen       443;
        server_name  Router;

	charset utf8;

        ssl                  on;
        ssl_certificate      /etc/easy-rsa/keys/ferrets.imzone.in.crt;
        ssl_certificate_key  /etc/easy-rsa/keys/ferrets.imzone.in.key;

	ssl_client_certificate /etc/easy-rsa/keys/ca.crt; #客户端证书认证所需要的ca证书

        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
	ssl_verify_client on; #启用客户端证书认证

        location / {
            proxy_pass ;
		proxy_redirect default;
        }
		location /transmission {
			proxy_pass ;
			proxy_redirect default;
		}
    }

嗯,像上面一样的配置文件我就是做的代理服务器,转发到192.168.1.1和192.168.1.1:9091,方便远程管理路由和transmission。

感觉一下子强力了好多啊。

有用的Screen(在ssh、telnet断开之后继续执行程序)

摘录自http://blog.csdn.net/wind19/article/details/4986458

原文中还提到了使用nohup的方法,不过我觉得还是screen比较方便,就剪掉了nohup的部分,想看的话点连接过去看。

开始使用Screen

简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话 中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样 几种方式:

1.直接在命令行键入screen命令[root@tivf06 ~]# screen

Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。

2.Screen命令后跟你要执行的程序。[root@tivf06 ~]# screen vi test.c

Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c ,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。

screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:[root@tivf06 ~]# screen vi /tmp/abc

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d (直接断开连接也可以的),Screen会给出detached提示:
暂时中断会话

半个小时之后回来了,找到该screen会话:[root@tivf06 ~]# screen -ls There is a screen on: 16582.pts-1.tivf06 (Detached) 1 Socket in /tmp/screens/S-root.

重新连接会话:[root@tivf06 ~]# screen -r 16582

看看出现什么了,太棒了,一切都在。继续干吧。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式 向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

可以通过C-a ? 来查看所有的键绑定,常用的键绑定有:C-a ? 显示所有键绑定信息
C-a w 显示所有窗口列表
C-a C-a 切换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a 0..9 切换到窗口0..9
C-a a 发送 C-a到当前窗口
C-a d 暂时断开screen会话
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式

继续阅读

使用mysqldump自动备份数据库

很久以前就开始喜欢使用自动任务来做写备份的工作。管理着的一台服务器上的论坛也是使用着mysqldump来备份,每天一次,另外再每周一次。

昨天刚把自家的博客也给加上自动备份,嗯。

用法是

mysqldump -uUserName -pPassword DataBaseName > FileName.sql

嗯,值得注意的是-p和password之间并没有空格……不然就会不认密码,这点比较奇怪。

cron的用法参考之前的文章

启用了Nginx作Luci的SSL前台

最近自己重新做固件嗯,因为某些癖好(算是吧,因为太钟爱于https了),一直在启用luci的https,可是不知道为什么,uhttpd的TLS插件无法启用,于是蛋疼了,我擦嘞,不了个是吧,不带这样玩啊…

于是只能启用不安全的uhttpd,让我一阵纠结,心里总是没有安全感…

一晃打开了transmission-web,突然想起了以前看到过的一个老外写的blog,说想远程管理transmission,但是transmission又没有密码保护(现在的版本好像有了),于是就用个nginx做前端,加上密码认证,就可以避免别人过来搞东搞西了。

这给了我启发,为什么不用nginx做SSL的前端呢?效果是一样的啊,顺带transmission的远端管理也可以做了,一举双得。

于是我动手了

首先是重新编译了一次nginx,因为官方编译的nginx没有包含ssl支持

然后启动了普通版的uhttpd,开始监听之后,修改nginx的配置,打开ssl支持,加上证书个密钥(因为用的是以前的证书,所以不用重新签),再写个proxy_pass(这个似乎有点问题,如果写到了location /path/ 中之后出现了问题,似乎是东西显示不完全,格式有点乱,后来写到 location / 中就没有问题了)

顺便把transmission的web管理加上,reload一次之后就完全没问题了。除了载入速度略有下降(transmission的web管理速度慢了稍微有点多)

附上一下配置文件

server {
listen 443;
server_name Router;

charset utf8;

ssl on;
ssl_certificate /etc/ssl/CA/keys/luci_school.crt;
ssl_certificate_key /etc/ssl/CA/keys/luci.key;

ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
proxy_pass ;
proxy_redirect default;
}
location /transmission {
proxy_pass ;
proxy_redirect default;
}
}

在搭建vpn的时候都是需要写iptables的

嗯,刚把openvpn给弄了出来,本来打算直接连上vps,然后写上路由表,结果没想到意外的麻烦,因为iptables的转发没有写好,结果只能ping到服务器,转发都转不出去,最后前思后想,觉得是这个iptables的问题,稍微翻一下以前的资料,找到了相关的内容。

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.9.0/24 -j MASQUERADE

像上面一样的命令,只要是搭建了vpn的话,就必须写这个(似乎openwrt不用,只要直接把新建的tun/tap接口加到lan里面,openwrt的firewall就会自动处理转发,真不愧是专门的路由系统啊),不然的话会不处理转发。

如果iptables里面的FORWARD默认处理时DROP或者REJECT的话,还要加上额外的允许

iptables -A FORWARD -s 192.168.9.0/24 -j ACCEPT

之前的真是折腾啊

gnome-terminal无法创建该子进程

最近在自家的路由上装起了fluxbox啊!各种强力啊!!

可是装上了fluxbox之后必须要跑的就是终端啊,这样就可以在没有外部干扰的情况下执行一些需要比较多时间的操作了。

不过在跑终端的时候还是遇到了问题,嗯,似乎是pts的问题,上网找了一下,找到了一个结局方案。

————————————————————————————————————————-
一下内容来自http://blog.chinaunix.net/space.php?uid=20357359&do=blog&id=1963423

今天中午睡醒之后,闲着没事,就想升级一下自己的系统吧。

apt-get dist-upgrade

因为升级了内核,我就重启了一下,结果发现桌面边成了1280×1024的了,不错!

但是我感觉系统好像慢了很多,尤其是gnome-terminal尤其的慢,连个ls也要很长时间。

再次重启,运行gnome-terminal的时候,弹出对话框:无法创建该子进程。

刚开始我以为是gnome-terminal的装的有问题,apt-get install gnome-terminal –reinstall。
结果依旧,现在我才开始意识到问题的严重性。

难道是gnome-terminal和其他程序冲突,例如gnome-pannel,重装gnome-pannel无果。

安装一下其他的X下的终端模拟器试一下,apt-get install konsole。
启动konsole,弹出对话框:
“Konsole is unable to open a PTY (pseudo teletype). It is likely that this is due to an incorrect configuration of the PTY devices. Konsole needs to have read/write access to the PTY devices.”

看来不是gnome-terminal的问题,那到底是什么问题呢?

google了一番,终于找到了跟我有相同问题的人:
http://kanotix.com/PNphpBB2-viewtopic-t-21461.html
竟然是同一天,老外也太快了。
方法1:

apt-get install initscripts/testing
(reboot)
如果已经安装了,可以尝试重新安装:apt-get install initscripts –reinstall
方法2:[未测试]
I added this line to my fstab:
devpts /dev/pts devpts gid=5,mode=620 0 0
and it seemed to do tthe trick.

原因分析:
http://forums.fedoraforum.org/archive/index.php/t-134006.html

——————————————————————————————————–

因为我的debian是chroot来的,于是多加上了一句

none /proc proc defaults 0 0

感动啊……终于成功做出固件,成功的chroot到debian了

很久以前就看到这个openwrt可以chroot到debian,想着,弄一个来玩玩啦,文章在已经记录在这里

可惜的是,因为这设备的缺陷(Buffalo WZR-HP-AG300H),没有FPU,导致需要启用FPU仿真,而很可惜的是,官方发布的固件都不会加上这个选项。不得不自己动手做一个。

自己做固件有相当一段时间了(其实也就一个月左右),之前的源码的话编译总是不成功。做不出来固件。直到最近,成功的做出了固件,然后自己当了一会小白鼠,直接刷上了。很幸运的是,没有变砖。可惜的是,因为做固件的时候没有选上某些kernel mod ,导致功能上的残缺。

于是又重新做了一个。这回没有问题了。

接下来的问题是,在debootstrap过程中, 缺少了device.tar.gz导致装不完全((这个很蛋疼,我试过在这里直接chroot,结果passwd都没有,用户名是“I have no name!”,连apt都没有),这时候只要找到debootstrap,打开,找到里面的devic.tar.gz,放到指定位置就好了。

又是好一阵折腾

嘛~因为开了vhosts,所以总出点什么问题……

刚刚把自己签署的证书都换了一遍,因为Google Chrome告诉我说,证书的签署算法太旧了,要被淘汰。于是又重新做了新的CA证书,然后把全部证书都重新做了一遍。中间发生了很多很多事情。

因为是签署算法的问题,所以一直在openssl里面看那些命令,不停地做,不停地做。结果最后签出来的证书都是MD5的。又尝试用DSA来做。可是用DSA做出来的根证书全部都是损坏了,不完整的,上Google搜,也没有相关的信息,结果放弃用DSA了。,老老实实用RSA。

然后又考虑是不是私钥的问题。用openssl genrsa 做了好多次,结果一旦加上什么参数就要我加上密码。我擦嘞,能不能不用密码啊,重启服务器都要输密码的话很麻烦啊。

后来翻来翻去,发现签署证书的时候,算法都是在openssl ca -md 命令里面设置的,终于找到了问题所在。 因为我是用着那个很久以前的sign.sh脚本来签署的,估计参数都在里面。然后打开一看,果真如此。改过之后再一sign,出来的就是sha1的算法,Chrome也没有报错了。于是马上动手全部换了一遍。

换了之后,问题又来了。wordpress的博客进不去了……访问的结果都是“No input file specified.”怎么改都不行,偏偏另外一个vhosts的php脚本没问题,跑phpmyadmin也没问题。php.ini的doc_root已经包括了wordpress的文件夹,可是还是不行。最后一怒之下,把doc_root给注释了,结果就好了……

今天意外多折腾啊

[笔记]Linux强制注销其他在线用户

原文地址:Linux强制注销其他在线用户

先用w查看在线用户。

goface ~ # w

11:53:14 up 53 min, 3 users, load average: 0.00, 0.01, 0.05

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 192.168.1.8 11:11 0.00s 0.51s 0.02s w

goface tty7 :0 11:11 53:25 42.50s 0.23s gnome-session –session=classic-gnome

root pts/1 192.168.1.8 11:38 14:53 0.37s 0.37s -bash

那么如何把别人踢过去呢,呵呵。

#pkill -kill -t tty

#pkill -kill -t pts/1

再w一下,发现另一个连接终端被踢了,呵呵。

另外也可以使用skill命令。如

#skill -KILL -t pts/1 能达到同样的效果。

#skill -STOP -u user1

#skill -KILL -u user1 杀死并注销user1。

当然ps grep找出进程杀死也可以实现,不过没有使用上面的命令方便。大家有什么更好的方法,欢迎在回复中评论,大家一起分享,哈哈。

不知为何……之前我在自己的VPS上不能kill掉另外一个bash进程,最后是用了

skill -KILL -t pts/1

才成功了……