relay(跳板机)搭建

初始化上线一台机器

pass

搭建otp认证模块

yum install gcc gcc-c++ pam-devel curl-devel -y
git clone http://git.corp.bianlifeng.com/sec/otp.git
cd otp/pam
sh build.sh
mv pam_otp.so /lib64/security/pam_otp.so

pam模块配置

./postlogin-ac

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.


session     [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session     optional      pam_lastlog.so silent noupdate showfailed

password-auth-ac

#%PAM-1.

auth        required      pam_env.so
auth        [default=1 success=ok] pam_localuser.so
auth        [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass
auth        sufficient    pam_unix.so
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so

sshd

#%PAM-1.0
auth       requisite    pam_otp.so host=127.0.0.1 port=28080 path=/auth.php user_field=user token_field=otp appid_field=appid appid_value=relay_pam
auth       required pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

nginx相关配置

yum install nginx -y
mkdir -p /data/logs/nginx/
systemctl restart nginx
cat /etc/nginx/conf.d/otp.vip.blibee.com.conf
upstream otp {
    server 10.253.60.189:28080 max_fails=1 fail_timeout=10s;
    server 10.253.60.194:28080 max_fails=1 fail_timeout=10s;
}

server {
    listen 127.0.0.1:28080;
    server_name otp.vip.blibee.com;
    access_log /data/logs/nginx/otp.vip.blibee.com.log main;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;
    proxy_next_upstream_tries 1;
    location / {
        proxy_pass http://otp;
    }
}

crontab -l

crontab  -l
# Lines below here are managed by Salt, do not edit
# for user key
# sync acount for relay
* * * * * /usr/local/bin/keys_sync -home=/home/ -d -r -a
# user key from relay1 to relay2, 已关闭
# */2 * * * * rsync -auz --password-file=/etc/.rsyncd/.secrets /home/ relay1.sys.ops.bj1.wormpex.com:/home/
# clean user home dir
01 04 * * * [ $(df -h|awk '$NF=="/"{split($4,F,"G");print F[1]}') -lt 100 ] && find /home -maxdepth 2 -mindepth 2 -type d|awk -F"/" '$NF!~/\./'|xargs -i rm -rf {}
# SALT_CRON_IDENTIFIER:sh /usr/local/uarchive/archive-data-collector.sh >>/var/log/cron-archive-data-collector.log 2>&1
39 0 * * * sh /usr/local/uarchive/archive-data-collector.sh >>/var/log/cron-archive-data-collector.log 2>&1
# kube key sync
30 * * * * sh /home/kube.sh >>/dev/null 2>&1

登录后的输出

[root@Relay profile.d]# cat /etc/profile.d/motd.sh
#motd
motd () {
    python /usr/local/bin/motd.py
}
[ "$(who -u am i|awk '{print $1}')" == "$(whoami)" ] && motd
cat /usr/local/bin/motd.py
#!/usr/bin/python
#-*- coding:utf8 -*-

print ("""

\033[1;22;32m
************************************ 公告 ************************************
说明:
\033[0m

\033[1;22;32m1.\033[0m  Server ssh 登陆: \033[1;33;32m现在由apptree鉴权\033[0m;

\033[1;22;32m2.\033[0m  从Relay登陆Server, 若鉴权失败时, 会遇到相关错误;
    \033[1;33;32m错误内容:\033[0m Permission denied (publickey, keyboard-interactive)

\033[1;22;32m3.\033[0m  莫慌, \033[1;33;32m请阅读wiki\033[0m, 从应用树申请权限;
    \033[1;33;32m
    wiki:
    http://wiki.corp.bianlifeng.com/pages/viewpage.action?pageId=132384145\033[0m

\033[1;22;32m
******************************************************************************
\033[0m
""")

整体的认证说明

#%PAM-1.0
auth       requisite    pam_otp.so host=127.0.0.1 port=28080 path=/auth.php user_field=user token_field=otp appid_field=appid appid_value=relay_pam
auth       required pam_sepermit.so   # 因为我们禁用的selinux,这个模块是完全没有什么用的。

auth        required      pam_env.so  # 读取/etc/security/pam_env.conf 这个文件配置环境变量

auth        [default=1 success=ok] pam_localuser.so require users to be listed in /etc/passwd 查看这个数据库中的的用户是否存在
auth        [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass    #  当用户主密码没有通过的时候再次提示数据密码
auth        sufficient    pam_unix.so # 记录日志

auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success # 如果用户uid大约1000才会通过认证

auth        sufficient    pam_sss.so forward_pass # 将用户输入的密码放在堆栈中方便其他的模块使用
auth        required      pam_deny.so # 

# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so # 如果/etc/nologin存在会认证不通过
account     required      pam_unix.so # 记录日志
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so # 如果返回bad就标记没有返回状态, 如果返回ok认证通过, 如果返回user_unknown,就忽略,认证通过
account     required      pam_permit.so # 将此行添加到其他登录条目以禁用帐户管理,但继续允许用户登录。这个模块是永远通过的

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=    # 密码质量检查

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok


password    sufficient    pam_sss.so use_authtok # 更改密码时,强制模块将新密码设置为先前堆叠的密码模块提供的密码。 对于我们现在的使用情况来看是没有什么用的。
password    required      pam_deny.so


# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close # 没啥用
session    required     pam_loginuid.so # 在切换用户的时候回修改登录的uid


# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_oddjob_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so
session     [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session     optional      pam_lastlog.so silent noupdate showfailed
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare
  • pam_sepermit.so
pam_sepermit模块根据SELinux强制状态允许或拒绝登录。

当登录的用户与配置文件中的条目匹配时,仅当SELinux处于强制模式时,才允许其访问。否则,他将被拒绝访问。对于不匹配配置文件中任何条目的用户,pam_sepermit模块返回PAM_IGNORE返回值。

配置文件包含每行一个用户名的列表,并带有可选参数。如果名称前面带有@字符,则表示组名称中的所有用户都匹配。如果以%字符作为前缀,则SELinux用户用于匹配名称而不是帐户名称。请注意,禁用SELinux时,无法确定分配给该帐户的SELinux用户。这意味着在禁用SELinux时,此类条目永远不会匹配,并且pam_sepermit将返回PAM_IGNORE。
  • pam_env.so
pam_env PAM模块允许(取消)设置环境变量。支持使用先前设置的环境变量以及PAM_ITEM(例如PAM_RHOST)。

默认情况下,如果未指定其他文件,则用于(取消)设置变量的规则来自配置文件/etc/security/pam_env.conf。

此模块还可以在单独的行(默认情况下为/etc/environment)中使用简单的KEY = VAL对解析文件。您可以使用envfile标志更改要解析的默认文件,并通过设置readenv将其打开或关闭。分别标记为1或0。

由于设置PAM环境变量可能会对其他模块产生副作用,因此该模块应该是堆栈中的最后一个模块。
  • pam_localuser.so
pam_localuser是一个PAM模块,可帮助实施站点范围的登录策略,该策略通常包括网络用户的子集和特定工作站本地的一些帐户。使用pam_localuser或pam_wheel或pam_listfile是一种限制本地用户和/或网络用户子集访问的有效方法。

也可以使用pam_listfile.so和cron调用的一个很短的awk脚本来实现,但是它很常见,已经被分离出来了。

.......具体的直接man 模块名看就行

posted @ 2020-02-11 10:58  王亚博客  阅读(1038)  评论(0编辑  收藏  举报