Nginx 利用Linux 的PAM 机制整合各种登录

来源:互联网 发布:php的缺点 编辑:程序博客网 时间:2024/05/16 09:15

 需求

    公司内部有各种各样的系统,每个系统都要用户登录密码,能否只采用一个用户名和密码来访问所有系统

  我的方案

1. 所有的用户都采用公司邮箱和邮箱密码来登录系统,一旦用户离职后,删除邮箱后保证用户不能再登录到各个系统。

 2. 基于 Linux PAM 机制

 3. 所有的应用都在Nginx 后面,Nginx 负责与PAM系统的交互。

 4. 各个系统的应用程序应该不关心用户认证,可以通过HTTP Header获得当前登录的用户。

  具体步骤

1.  根据认证应用系统编写认证的URL请求

    比如 http://xxxxx/login.jsp?user=xxxx&password=xxxx 

    认证成功返回 0,不成功返回 -1

2.  采用PAM_SCRIPT 来整合这个URL认证

  注意:不要用 yum install pam_script

  1) 下载并编译 PAM_SCRIPT 模块

     下载地址:https://github.com/jeroennijhof/pam_script

  2) 编译步骤

     aclocal

      autoheader

      libtoolize

      automake -a

      autoconf

      ./configure

      make

     将编译好的pam_script.so 复制到 lib 目录,我的是 /lib64/security/pam_script.so

   3) 按照文档建立相应的脚本

pam_script_acct 
pam_script_auth
pam_script_passwd
pam_script_ses_close 
pam_script_ses_open


pam_script_auth 用于认证,与认证系统对接,脚本如下:

 

stamp=`/bin/date +'%Y%m%d%H%M%S %a'`# get the script name (could be link)script=`basename $0`#LOGFILE=/var/log/pam-script.logecho $stamp $script $PAM_SERVICE $PAM_TYPE                                \        user=$PAM_USER ruser=$PAM_RUSER rhost=$PAM_RHOST                \        tty=$PAM_TTY                                                        \        args=["$@"]                                                        \        >> $LOGFILEchmod 666 $LOGFILE > /dev/null 2>&1
 认证URL
URL="http://authUrl?user=$PAM_USER&password=$PAM_AUTHTOK";RET=`curl $URL 2>/dev/null`#echo "-----------------------"#echo $RETif [ "$RET" = "0" ]; then  exit 1;fi# successexit 0

 3. 在PAM机制里增加认证

    /etc/pam.d 下新建一个 neulion 的认证模块

    内容如下:

   

auth    required    pam_script.so  dir=/usr/bin/neulion  <<<<目录下就是pam_script 的几个脚本account required    pam_permit.so

 4. 写一个test.sh 进行验证

PAM_USER=neil.mao
PAM_AUTHTOK=xxxxxxx
/usr/bin/neulion/pam_script_auth


5. 下载 Nginx 的 PAM 模块

    http://web.iti.upv.es/~sto/nginx/


6. 下载Nginx 

      wget http://nginx.org/download/nginx-1.4.4.tar.gz


编译脚本类似:

./configure--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid--lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp--http-proxy-temp-path=/var/cache/nginx/proxy_temp--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx--with-http_ssl_module --with-http_realip_module --with-http_addition_module--with-http_sub_module --with-http_dav_module --with-http_flv_module--with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module--with-http_random_index_module --with-http_secure_link_module--with-http_stub_status_module --with-mail --with-mail_ssl_module--with-file-aio --with-ipv6 --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2-fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'--add-module=/root/ngx_http_auth_pam_module-1.3


7 . 整合测试

   nginx 的conf 加入

   location /vos {

            auth_pam      "Please specify loginId"; <<<登录提示
            auth_pam_service_name "neulion"; <<<< 认证模块,根据上面配置的
            auth_pam_set_pam_env  on;
            proxy_pass   http://10.7.1.70:80;  <<<<<<<<<  后端的系统系统
            client_max_body_size 1000m;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Remote-User $remote_user;  <<<<<<<< 登录的用户
       }


  然后浏览器访问: 输入用户名和密码,认证通过后,就可以访问应用了。


 8.  进一步

    1.如何限定某些用户 访问应用?

         可以增加一项pam配置。

         auth    required    pam_listfile.so item=user sense=allow file=/etc/security/api.allow onerr=fail

         只允许在 这个列表里的用户才能进行登录,

   

   2.认证的日志在哪里看?

       /var/log/pam_script.log 里可以看到

   3. 注意事项

     1) 确保 pam_script.so 已编译
     2) 确保 /etc/pam.d/neulion 认证模块编写正确,修改这个不需要重新启动,立即生效
     3)    确保 nginx 配置里的    auth_pam_service_name 在 /etc/pam.d 下存在
  






 


 

1 0