Nginx 模块 HTTP OwnerMatch

我编写了一个 Nginx 模块 HTTP OwnerMatch 解决了 Nginx 虚拟主机间可通过链接型文件(硬链接和符号链接)跨站访问的问题。通过这个模块可以指定每个虚拟主机的每个 Location 可以或不可以访问的哪些用户的文件。

配置文件实例

location / {
          root   html;
          index  index.html index.htm;
          omallow heiher;  # 允许访问隶属于 heiher 的文件 
          omallow guest sftp;  # 允许访问隶属于 guest:sftp 的文件 
          omdeny all;         #  不允许访问其它任何文件
}

源代码仓库

git clone git://github.com/heiher/nginx.git

Over!

52 thoughts on “Nginx 模块 HTTP OwnerMatch”

  1. @dr.web 目前就解决了,脚本的执行进程都是虚拟主机用户执行的,不过和这篇日志无关。详细的虚拟主机配置以后发布。

  2. @dr.web 忘记说了,Apache + SuEXEC 的虚拟主机方案还是存在链接型文件的跨站问题,http://www.heiher.info/1675.html 这里就在安全配置文件中增加了 Options -FollowSymLinks +SymLinksIfOwnerMatch 让 Apache 去 OwnerMatch。

  3. 前面看到了你一篇封装sock的,没说php是以用户身份运行。

    ps,这个patch适合。0.8.x吗?也没什么文档?何不提交到nginx官方去呢?

  4. 一直听说nginx有跨站的问题,不过不懂问题在那里,在网上找了一些解决办法。看上去博主的办法是最好的。博主能解释一下

    虚拟主机间可通过链接型文件(硬链接和符号链接)跨站访问的问题

    吗?

    1. 脚本解释器如 PHP是运行于不同用户权限下的,这个问题不大。关键是 Web Server 如 Nginx 通常运行于 www-data 用户下,这就要求所有的用户目录 www-data 用户都可以读。这样的情况下,A 用户在自己的目录创建一个符号链接,链接到B用户目录的某个文件,并通过HTTP访问在自己目录的这个符号文件,即可通过WS下载到B用户的私有文件。

          1. ngx_http_owner_match_module.c: In function ‘ngx_http_owner_match_handler’:
            ngx_http_owner_match_module/ngx_http_owner_match_module.c:111: 错误:‘ngx_http_request_t’ 没有名为 ‘zero_in_uri’ 的成员

  5. 我在找你的nigix安装配置文章。

    其实这样有个好处就是让php以用户执行,这样就不用chown www-data了

      1. 我想用ngnix,主要是内存消耗少,还有我那不稳定的burst……

        把邮件回复默认勾上吧,不然你回复我了我也不知到……

  6. 能不能写一下怎么用啊,我很想用这个模块,可是我是菜鸟,不知道要怎么用到nginx上面去啊

  7. 我是centos6.0的系统,现在用nginx-1.1.4
    我解压nginx-1.1.4.tar.gz
    然后试过你回答其他人的打补丁方法都无法打上补丁,求教。

      1. 您好,我下载了最近新版的nginx-1.1.6.tar.gz。
        tar zxvf nginx-1.1.6.tar.gz
        然后下载您的补丁,使用您说的方法打入补丁
        patch -Np1 -i Nginx-1.1.6-Add-OwnerMatch-module.patch

        有报错,或者是我不知道接下去该怎么做:
        root@l500 software]# patch -Np1 -i Nginx-1.1.6-Add-OwnerMatch-module.patch
        The next patch would create the file modules/http/owner-match/config,
        which already exists! Skipping patch.
        1 out of 1 hunk ignored
        The next patch would create the file modules/http/owner-match/module.c,
        which already exists! Skipping patch.
        1 out of 1 hunk ignored
        can’t find file to patch at input line 305
        Perhaps you used the wrong -p or –strip option?
        The text leading up to this was:
        ————————–
        |diff –git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
        |index af41ea3..5abf932 100644
        |— a/src/os/unix/ngx_files.h
        |+++ b/src/os/unix/ngx_files.h
        ————————–
        File to patch:

        我是菜鸟刚入行,麻烦指教如何正确的安装补丁。

        1. 你是要做多用户的虚拟主机吗?
          解决方法是进入 nginx-1.1.6 这个目录后再打补丁。
          configure 参数要增加上 –add-module=modules/http/owner-match

          1. 嗯,是的,我想做这方面的研究,因为nginx的虚拟机似乎最难实现,有各种麻烦。

            我现在打上了补丁,但是添加这个模块似乎还是错误,我是centos6的用户。
            [root@l500 nginx-1.1.6]# patch -Np1 -i Nginx-1.1.6-Add-OwnerMatch-module.patch
            patching file modules/http/owner-match/config
            patching file modules/http/owner-match/module.c
            patching file src/os/unix/ngx_files.h
            patching file src/os/unix/ngx_user.c
            patching file src/os/unix/ngx_user.h

            [root@l500 nginx-1.1.6]# ./configure –add-module=modules/http/owner-match

            ./configure: error: invalid option “–add-module=modules/http/owner-match”

            请求你的帮助,谢谢你。

  8. 非常感谢,我编译上了。马上来实验下。
    多谢您的热情帮助,希望你修改下这篇文章,把具体添加步骤写详细点,相信会有很多人需要你这个模块。

      1. 谢谢博主,不知道能不能出一个详细一些的,像我们这些小白,对GIT不是很熟悉。

        谢谢哈!:)

        1. 克隆仓库
          git clone git://gitcafe.com/heiher/nginx.git

          Checkout ownermatch 分支
          cd nginx; git checkout -b ownermatch remotes/origin/ownermatch

          然后就可以编译了,记得增加上这个 module,看上面的评论。

  9. patch: **** Can’t open patch file Nginx-1.1.6-Add-OwnerMatch-module.patch : No such file or directory
    我觉得,这么好的东西,博主可以做个傻瓜式的说明。 1、2、3、4列出步骤。

Leave a Reply

Your email address will not be published. Required fields are marked *