Sftp chroot howto

我之前在服务器上应用 Ftp chroot,那设置起来相对简单。但 Ftp service 不是服务器预装的,通常我会装 proftpd 或 vsftpd。

这次我想为什么不用服务器预装的 Sftp service?我有点钻了牛角尖—— Sftp 比 Ftp 好在哪?更安全?似乎这增加的安全性对我来说毫无意义。少占点硬盘空间?空余字节多着呢。总之,我想到了就想把它用起来。

首先新建一个用户组,sftponly,只要是这个组的用户 Sftp 登录后都会被 chroot。


groupadd sftponly

然后把需要 chroot 的用户都加到 sftponly 组


usermod -a -G sftponly user1

如果是新用户,则在创建的时候直接参组。


useradd -U -G sftponly -s /sbin/nologin -d /path/to/user1_home user1

然后要保证 /path/to/user1_home 这个目录及所有各级父目录的属主是 root,属性 755。user1 在他的 home directory 下是没有写权限的,不能由他自己创建文件或文件夹。这也容易理解,因为他被 chroot 以后,他的 home directory 看上去是系统根目录,普通用户当然不能在根目录这一级有写权限。这时需要 root 事先为 user1 创建好若干文件夹,如 /path/to/user1_home/documents、/path/to/user1_home/pictures,并将 documents、pictures 的属主指定为 user1。

然后我按网上的指点依样画瓢,在 /etc/ssh/sshd_config 里添加了这几行:


Match Group sftponly
    ForceCommand internal-sftp
    ChrootDirectory %h

然后重启 sshd service


service sshd restart

理论上这时 user1 已经可以在 Sftp 登录是被 chroot,限定在他的 home directory。但是 user1 怎么都登录不了,碰到的错误是:

Connection closed by server with exitcode 1

原来,在我的 /etc/ssh/sshd_config 里有这么一行


Subsystem       sftp    /usr/libexec/openssh/sftp-server

这是服务器预装时的配置,可能不是所有的服务器都这样,但有一定的普遍性。

这说明,Sftp 子系统是由 /usr/libexec/openssh/sftp-server 支持的。而在被 chroot 的 user1 看来,是没有 /usr/libexec/openssh/sftp-server 这个文件的。怎么办?两个办法:

办法一:将那一行改为


Subsystem     sftp    internal-sftp

办法二:在 user1 的 home directory 下建一个副本 %h/usr/libexec/openssh/sftp-server,只是简单的文件拷贝。

 

I almost forgot how to use Apache

我不用 Apache 很多年,几乎忘了该怎么完整地配一台 Apache server。最近上线了一台 FreePBX,我想加强 web server 的安全系数,要修改一些默认参数。因为对 FreePBX 还不是很了解,所以不敢贸然把它的 web server 用我喜欢的 Nginx 代替,只好沿用元配的 Apache,捣腾它的 conf 文件。

首先,我想弄个 VirtualHost,把 FreePBX admin 界面隐藏到不公开的 ServerName 上。我忘了在使用 name based virtual host 前要先使用 NameVirtualHost 先声明一下。


NameVirtualHost ip_address:port_number

其次,启用了 VirtualHost 以后,VirtualHost 之外的 main DocumentRoot 就不起作用了。我在 VirtualHost 之外定义了一个 DocumentRoot 并想当然地认为它是 default server (未经任何一个 VirtualHost 定义的 server)的 DocumentRoot。事实上,VirtualHost 的 default server 是由 _default_ 显式定义,或在 _default_ 缺失的情况下,第一个 VirtualHost 就是 default server。

Get rid of snapdo.com

Snapdo.com 非常流氓,一旦进驻,到处修改设置,把每个浏览器改得面目全非。

Snapdo haunted in my computer
Snapdo haunted in my computer

杀毒软件不当它是病毒,所以指望杀毒软件来修正错误是不可能的。我手动修正了多处地方,过了几天发现它还潜伏在那里。

今天又发现 Snapdo 原来是 Quickshare 在作祟。去 installed programs 里一看,果然有一个 Quickshare (之前没找到 Snapdo,以为 Snapdo 不敢暴露自己)。赶紧卸载。

Quickshare installed
Quickshare installed

发现 Snapdo 是 Quickshare 纯属偶然。因为 Chrome new tab 时仍出现 Snapdo,我搜了一下怎么恢复 Chrome new tab。有人说在 chome://flags disable Instant Extended API,但没效果,又有人说在 chrome://extensions/ disable all extensions。我这才发现 Quickshare,直接移除。

Remove quickshare extension
Remove quickshare extension

Step by step setup OpenVPN server on DrayTek router

一直以来都是偷懒,习惯用 PPTP 连接 VPN server。但 PPTP 安全性欠佳,overhead 又偏大,是时候让自己过渡到 OpenVPN 或者其他非 PPTP 方式的 VPN 了。

找到一个教程,是针对 Windows 用户的,先做个笔记。有空之时我再研究 Linux client 怎么连入 OpenVPN server on DrayTek router。

I thought I lost Hotmail

Hotmail 今天给我惊了一身冷汗。

我不用 hotmail 很多年。今天由于某种需要,登录了一下 hotmail。我虽然牢记我的密码,但是 hotmail 过于热心地说,“您好久不来了,我给你发个验证码”。

Hotmail wants to verify me
Hotmail wants to verify me

验证码发到哪儿呢?hotmail 显示了以前留给 hotmail 恢复密码用的另一个邮箱。hotmail 显示了恢复邮箱@前的前 2 个字母结果,其他用一串星号遮住。那是很久以前我用的一个免费邮箱提供商提供的邮箱,我申请过多个,有些已经不属于我了。

天哪!hotmail 会把验证码发到哪儿?我诚惶诚恐地登录了其中一个,一堆垃圾邮件,但没有新邮件;退出再登一个,也没有。晕了晕了——要是 hotmail 把验证码乱发,那我的 hotmail 也要被别人拿去了。然后骗子可能拿着我的账号去借钱,然后……

还好,我再点一次让 hotmail 重发验证码,这次收到了,而且一次收到两个,不知道上一个验证码是发送延迟,还是接收延迟。哎,草草登录了事。hotmail 在欢迎页面上兴致勃勃地介绍起 outlook.com,我却有点哭笑不得。

I am not reading this welcome
I am not reading this welcome

Like WordPress, Dislike Cisco

WordPress 升 3.3了,感觉更清新了。好喜欢。

Cisco 本是不相干的一件事,为了省事,我放一块说了。两年前买了 Cisco WVC210 wireless IP camera,当时市价 £150左右,我买的是样机,£90。买了之后玩了两天就成了摆设,因为它距离路由器10米的地方隔两堵墙就不工作了。

最近为 hotel 买了几个 Xenta Wireless Night and Day Wireless IP Network Camera,£50不到,超级满意。我本不太敢买 Xenta 的产品,因为没有这个牌子的使用经验,事实证明我的顾虑是多余的。

跟 Cisco WVC210 wireless IP camera 相比好在哪?

  • 首先,Xenta 有红线成像而 Cisco 没有;
  • 其次,Xenta 内置喇叭而 Cisco 没有;
  • 再次,Xenta pan & tilt 时静悄悄的而 Cisco 有吱吱声;
  • 最后,Xenta 物美价实,而 Cisco 卖了两年还在卖 £150。

Damn phishing

网络骗子很可恶,因为它们在一个八杆子打不着的地方诱人上钩。虽然我不会上钩,但拿它们没办法,所以它们可恶。

今天接到一个未知号码(诈骗特征一)的来电,接起来后线路质量不是很好(诈骗特征二),一个印度口音的男子自称来自我的手机公司,问我是某某某吗。

因为线路不好,所以我根本没听清它到底称呼我什么,我就说:

“Yes?”

它说:

“You ordered a brand new phone in a year’s time, right?”

我这时不能确定它的意图,可能是手机公司要给我 upgrade,那就继续听下去。我还是说:

“Yes?”

它说:

“Can you confirm your name?”

我立马警觉,说:

“Why do I need to confirm my name?”

它说:

“Because I want to verify your name.”

我说:

“Why do you want to verify my name?”

它见我不上钩,挂了。我还是觉得很气愤,骗子们四处逛,总有无知的会上钩,谁能整整这些败类,啊?!

I could use Google apps account as my OpenId

Years ago, I knew OpenId.
Years ago, I knew Google account supports OpenId as OpenId provider.
Years ago, I knew Google apps premium version account support SSO.

And I was misled by many threads that Google apps standard version account does not support OpenId. I did try several times without success, but I did not try hard.

Today, a great post How to Setup OpenID with Google Apps gave me a big confidence that I can do it. So I tried hard – spent a whole evening trying, and successfully logged into SourceForge with my Google apps acount, and I am using Google apps standard version!

Is it a serious security leak for WordPress bloggers?

By WordPress default settings, anyone who knows WordPress blog administrator’s email address can put this address in comment required field, and make comment without being moderated as if he was the administrator. I think it is very bad design of authentication. It worries me a lot although none of my blog users pretend to be me so far.

I never publish my email address on the web to protect it from spam. But you can find my email address in many places – I print it on business cards, write it on CV, give it to people first met in pubs… Now I have to rethink how to use my email address.

I think password check is essential if someone is acting like the administrator in WordPress blog. If it can be bypassed, it means I have to keep my email address as my privacy.  Birthday is a privacy, residence address is a privacy. There are so many privacies to keep. And now, email address?

Run httpd with SELinux

我实在不理解 SELinux,以前为了求简单,都是直接 disable SELinux。我也知道这样不好,可以没办法。

最近重装系统,第一次选 Web Server 来装,我想这样搭配出来的 SELinux 最接近我的要求。可是,但我添加了 zend.repo 以后,发现 httpd 无法启动,错误信息为:

# service httpd start
Starting httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 6 of /etc/httpd/conf.d/zendserver_php.conf: Cannot load /usr/local/zend/lib/apache2/libphp5.so into server: /usr/local/zend/lib/apache2/libphp5.so: cannot enable executable stack as shared object requires: Permission denied
                                                           [FAILED]

我按论坛上的建议,执行了

# find /usr/local/zend/lib/ -name "*.so*" -exec semanage fcontext -a -t textrel_shlib_t {} \;

错误仍在。然后按 SELinux 的建议,执行了

# setsebool -P httpd_execmem 1

呵,成了。因为我不会 undo # find /usr/local/zend/lib/ -name “*.so*” -exec semanage fcontext -a -t textrel_shlib_t {} \; 所以我不知道此命令是否必要。