relay(跳板机)搭建
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 模块名看就行