如何n-factor
为 CentOS 7 服务器的所有 SSH 连接启用(并要求)身份验证?
我读过有关 Google Authenticator 的内容,它提供了二因素认证。但这仅限于您必须在每个用户的移动设备中安装的应用程序提供的 pin。
如何添加可变数量的身份验证因素?其他因素的一些示例可能包括:
1.) a pin code emailed to the administrator's work email address
2.) a USB key
3.) a pin texted to the administrator using a tool like twilio
etc.) ...
发送 pin 电子邮件和文本的 Java 程序很容易构建,并且可以由替代默认 ssh 身份验证脚本的 shell 脚本调用,但我以前从未编写过 shell 脚本。
假设 Java 已经编写好了,完成这个任务的 shell 代码会是什么样子?我应该把 shell 脚本放在哪里? shell 脚本的伪代码可能包括以下步骤:
1.) Trigger the Java program to send email, text, etc. with custom pins
when administrator types ssh [email protected]
2.) Replace the login password prompt with a series of prompts to
get the pins/credentials from
2.) Possibly interact with a client program to get the usb signature
3.) Send the credentials to the java program, with time stamp to ensure
login was done within a minute after java sent the pins
4.) Compare the Boolean returned by the java program with the CentOS password check
5.) Either authenticate or reject the user
我对 shell 脚本初稿的猜测可能是:
#!/bin/bash
USER_NAME=#How do I populate this?
TEXT_PIN=shuf -i 1-10000 -n 1
EMAIL_PIN=shuf -i 1-10000 -n 1
CLASSPATH=/path/to/classes
java -cp $CLASSPATH my.package.SendPinsClass TEXT_PIN EMAIL_PIN
if [ $? -eq 0 ]
then
echo -n "We were not able to send authentication credentials. Please log the current time and report this to the chief administrator. "
else
echo -n "Pin numbers have been sent to your email and phone number. Please check your email and text messages now before continuing the authentication process. "
fi
echo -n "Enter Pin number from cell phone: "
read TEXT_PIN
echo -n "Enter Pin number from email: "
read EMAIL_PIN
java -cp $CLASSPATH my.package.AuthenticationClass USER_NAME TEXT_PIN EMAIL_PIN
if [ $? -eq 0 ]
then
#DO NOT AUTHENTICATE
else
#LOG THIS USER IN!
fi
#HOW DO WE CHECK THE USER'S CentOS 7 PASSWORD?
#THIS SCRIPT MUST INCLUDE A PASSWORD CHECK IN AUTHENTICATION PROCESS.
shell 脚本中还包含哪些内容?我该如何将其放置到位?
规格为回答如上所述。然而,评论也欢迎建议更简单的工具而不是自己开发工具,因为评论。
编辑:
根据我正在进行的研究,我只是在上面的 shell 脚本草稿中添加了更明确的细节,以记录脚本验证用户身份所需执行的步骤。可以假定关键步骤由 shell 脚本调用的两个“黑盒”java 程序成功完成。在完成之前必须回答的主要剩余问题包括:
1.) How does the script receive and populate the value for the USER_NAME variable?
2.) How does the script check the user's CentOS 7 OS password, and
how should the password be integrated into the script's authentication
process? Note the security of the password needs to be protected.
3.) How does the script process the approval or rejection of the
authentication request with the CentOS 7 operating system?
4.) How is the working shell script placed in the authentication
process to replace the default authentication script?
注意:如果 CentOS 7 中脚本的实现涉及将脚本捆绑为PAM module
@steve 在他的评论中建议的那样,那么接受的答案需要给出明确的指令,不仅用于更改 shell 脚本,还用于将 shell 脚本集成到PAM module
以及身份验证过程的任何其他方面。答案需要在 CentOS 7 上运行。
第二次编辑:
根据@steve 在下面的评论中发布的链接,默认内容/etc/pam.d/sshd
如下:
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
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 optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
请注意,在 CentOS 7 中,/lib/security/
不存在,因此不是 PAM 模块的位置,如 @steve 的链接(适用于 Debian)。因此,如果没有 PAM 模块,我们就无法将 shell 脚本存储在我的 OP 中/lib/security/2ndfactor.so
。 @steve 链接中的教程建议使用以下代码将脚本分配给/lib/security/2ndfactor.so
.我们如何更改以下代码?
apt-get update
apt-get install build-essential libpam0g-dev libcurl4-openssl-dev
gcc -fPIC -lcurl -c 2ndfactor.c
ld -lcurl -x --shared -o /lib/security/2ndfactor.so 2ndfactor.o
@steve 的链接还建议我们编辑以添加对after 的/etc/pam.d/sshd
引用,如下所示: 2ndfactor.o
@common-auth
# PAM configuration for the Secure Shell service
# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
auth required pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
auth required pam_env.so envfile=/etc/default/locale
# Standard Un*x authentication.
@include common-auth
auth required 2ndfactor.so base_url=http://my.server.com/send_code.php code_size=5
但是,正如您在上面看到的,/etc/pam.d/sshd
CentOS 7 中默认的 不包含@include common-auth
.另外,@steve 的链接使用 php 脚本的 Web url,但我试图从 shell 脚本调用 java 程序。必须有一种方法可以在不暴露网址的情况下做到这一点。
最后,@steve 的链接说要设置ChallengeResponseAuthentication = yes
in /etc/ssd/sshd_config
,但在 CentOS 7 中没有/etc/ssd/
目录。
有人可以展示如何使这一切适应 CentOS 7 和 Java 吗?
答案1
标准 *nix 身份验证堆栈使用 PAM。您需要考虑为 PAM 构建一个模块: http://www.linux-pam.org/Linux-PAM-html/
通常,多因素身份验证供应商会提供一种。例如,以下是实施 google 身份验证器作为 SSH 登录第二个因素的操作指南: http://spod.cx/blog/two-factor-ssh-auth-with-pam_oath-google-authenticator.shtml
您可以将 PAM 配置为支持各种不同的充分因素或强制因素。
编辑:我并不是想变得困难——我只是想改变你的研究方向。从第二次编辑开始,您请求帮助调整一组行,其中包括:gcc -fPIC -lcurl -c 2ndfactor.c
这是赠品。您无法编译 shell 脚本。 PAM 模块是用 C 语言编写的,并使用 gcc 进行编译(在本示例中)。您也许能够从 PAM 模块内部调用 java 应用程序,但这超出了本站点的范围,也超出了我的知识范围。
其他注意事项:
- 现代 CentOS 版本的 PAM 模块将位于 /lib64/security/ 中,以防您需要 32 位和 64 位库
Lastly, @steve's link says to set ChallengeResponseAuthentication = yes in /etc/ssd/sshd_config, but in CentOS 7 there is no /etc/ssd/ directory.
这可能只是一个拼写错误,应该是 /etc/sshd
替代方案:作为系统管理员,我不鼓励使用“奇怪”的配置。 PAM 是众所周知且被接受的身份验证方法,除 sshd 之外的许多应用程序都可以并且将会使用它。
但是,如果您只关心在 tty 会话中为 sshd 实现 2FA,您可以考虑在 sshd 配置中使用 ForceCommand 选项: http://ben.akrin.com/?p=1290
您应该注意,经过身份验证的用户稍后可以相对容易地规避未来通过 ForceCommand 强制实施 2FA 的尝试,因此这并不是一个很好的解决方案: https://serverfault.com/questions/639771/how-secure-is-ssh-forcecommand-on-a-jump-host