- OpenSSH_5.8p1,OpenSSL 0.9.8e-fips-rhel5 2008 年 7 月 1 日
- selinux-策略-2.4.6-338.el5
- pam-0.99.6.2-12.el5
SELinux 以宽容模式运行:
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: disabled
Policy version: 21
Policy from config file: targeted
每当我通过 ssh 登录时,/var/log/secure
都会抱怨:
sshd[4957]: Accepted publickey for quanta from 192.168.3.40 port 55822 ssh2
sshd[4957]: pam_unix(sshd:session): session opened for user quanta by (uid=0)
sshd[4957]: error: ssh_selinux_setup_pty: security_compute_relabel: Invalid argument
谷歌指向我这Fedora 论坛上的帖子:
可能最简单的方法(尽管最长)是创建文件
/.autorelabel
和reboot
。
但我想知道还有其他方法可以摆脱这个问题无需重启?
安全上下文quanta
:
$ id -Z
system_u:system_r:unconfined_t:SystemLow-SystemHigh
Linux 用户与 之间的映射user_u
:
$ sudo /usr/sbin/semanage login -l
Login Name SELinux User MLS/MCS Range
__default__ user_u s0
root root SystemLow-SystemHigh
SELinux 用户:
$ sudo /usr/sbin/semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
root user s0 SystemLow-SystemHigh system_r sysadm_r user_r
system_u user s0 SystemLow-SystemHigh system_r
user_u user s0 SystemLow-SystemHigh system_r sysadm_r user_r
正在运行的安全上下文sshd
:
$ ps -eZ | grep sshd
system_u:system_r:unconfined_t:SystemLow-SystemHigh 9509 ? 00:02:11 sshd
system_u:system_r:unconfined_t:SystemLow-SystemHigh 18319 ? 00:00:00 sshd
system_u:system_r:unconfined_t:SystemLow-SystemHigh 18321 ? 00:00:00 sshd
sshd 的 PAM 配置:
#%PAM-1.0
auth include system-auth
account required pam_nologin.so
#account required pam_access.so
account include system-auth
password include system-auth
session optional pam_keyinit.so force revoke
session include system-auth
session required pam_loginuid.so
我已经尝试过但没有帮助的方法:
# yum reinstall selinux-policy-targeted
# restorecon -R -v /etc/selinux/
# restorecon -R -v /home/
/var/log/audit/audit.log
:
type=USER_AUTH msg=audit(1362372405.835:28361028): user pid=14332 uid=0 auid=503 subj=system_u:system_r:unconfined_t:s0-s0:c0.c1023 msg='op=pubkey_auth rport=50939 acct="quanta" exe="/usr/sbin/sshd" (hostname=?, addr=192.168.3.40, terminal=? res=success)'
更新时间:2013 年 3 月 4 日星期一 21:20:49 ICT
回复 Michael Hampton:
请记住原因重启的原因是更改安全上下文会影响正在运行的服务,因此至少应该重新启动受影响的服务(即重新启动 sshd)。
root 10244 1 0 17:18 ? 00:00:00 /usr/sbin/sshd
/var/log/secure
Mar 4 17:18:48 hostname sshd[10308]: error: ssh_selinux_setup_pty: security_compute_relabel: Invalid argument
更新时间:2013 年 3 月 5 日星期二 21:54:00 ICT
您能提供的输出
ls -lZ /dev/pts /dev/ptmx
吗?
# ls -lZ /dev/pts/ /dev/ptmx
crw-rw-rw-. 1 root tty system_u:object_r:ptmx_t 5, 2 Mar 5 21:54 /dev/ptmx
/dev/pts/:
total 0
crw--w----. 1 quanta tty system_u:object_r:devpts_t 136, 0 Mar 5 21:54 0
crw--w----. 1 dieppv tty system_u:object_r:devpts_t 136, 1 Feb 26 17:08 1
crw--w----. 1 dieppv tty system_u:object_r:devpts_t 136, 2 Feb 25 17:53 2
更新时间:2013 年 3 月 6 日星期三 10:57:11 ICT
我已经整理了openssh-5.8p1,然后复制配置文件(/etc/ssh/
和/etc/pam.d/sshd
),并从不同的端口启动。
令我惊讶的是,/var/log/secure
当我尝试登录时没有任何抱怨:
sshd[5061]: Server listening on 192.168.6.142 port 2317.
sshd[5139]: Accepted publickey for quanta from 192.168.3.40 port 54384 ssh2
sshd[5139]: pam_unix(sshd:session): session opened for user quanta by (uid=0)
新守护进程的安全上下文/usr/local/sbin/sshd
与旧守护进程相同(/usr/sbin/sshd
):
ps -efZ | grep /usr/local/sbin/sshd
system_u:system_r:unconfined_t:SystemLow-SystemHigh root 5061 1 0 10:56 ? 00:00:00 /usr/local/sbin/sshd
system_u:system_r:unconfined_t:SystemLow-SystemHigh root 7850 3104 0 11:06 pts/3 00:00:00 grep /usr/local/sbin/sshd
你有什么想法?
更新时间:2013 年 3 月 6 日星期三 15:36:39 ICT
确保使用 进行编译
--with-selinux
,默认情况下它不会完成。
OpenSSH has been configured with the following options:
User binaries: /usr/local//bin
System binaries: /usr/local//sbin
Configuration files: /etc/openssh
Askpass program: /usr/local//libexec/ssh-askpass
Manual pages: /usr/local//share/man/manX
PID file: /var/run
Privilege separation chroot path: /var/empty
sshd default user PATH: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local//bin
Manpage format: doc
PAM support: yes
OSF SIA support: no
KerberosV support: no
SELinux support: yes
Smartcard support:
S/KEY support: no
TCP Wrappers support: no
MD5 password support: yes
libedit support: no
Solaris process contract support: no
Solaris project support: no
IP address in $DISPLAY hack: no
Translate v4 in v6 hack: yes
BSD Auth support: no
Random number source: OpenSSL internal ONLY
Host: i686-pc-linux-gnu
Compiler: gcc
Compiler flags: -g -O2 -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wno-pointer-sign -fno-strict-aliasing -fno-builtin-memset -fstack-protector-all -std=gnu99
Preprocessor flags:
Linker flags: -fstack-protector-all
Libraries: -lresolv -lcrypto -ldl -lutil -lz -lnsl -lcrypt
+for sshd: -lpam -lselinux
+for ssh: -lselinux
/var/log/secure
当登录到端口 22 时(/usr/sbin/sshd
):
sshd[27339]: Accepted publickey for quanta from 192.168.3.40 port 50560 ssh2
sshd[27339]: pam_unix(sshd:session): session opened for user quanta by (uid=0)
sshd[27339]: error: ssh_selinux_setup_pty: security_compute_relabel: Invalid argument
sshd[28025]: Received disconnect from 192.168.3.40: 11: disconnected by user
sshd[28022]: pam_unix(sshd:session): session closed for user quanta
/var/log/secure
当登录到端口 2317 时(/usr/local/sbin/sshd
):
sshd[27705]: Accepted publickey for quanta from 192.168.3.40 port 34175 ssh2
sshd[27705]: pam_unix(sshd:session): session opened for user quanta by (uid=0)
sshd[27707]: Received disconnect from 192.168.3.40: 11: disconnected by user
sshd[27705]: pam_unix(sshd:session): session closed for user quanta
这里有证明它进入的日志ssh_selinux_setup_pty
:
sshd[4023]: debug1: SELinux support enabled
sshd[4023]: debug3: ssh_selinux_setup_pty: setting TTY context on /dev/pts/3
sshd[4023]: debug3: ssh_selinux_setup_pty: User context is user_u:system_r:unconfined_t, target tty is
system_u:object_r:devpts_t
sshd[4023]: debug3: ssh_selinux_setup_pty: done
答案1
该/.autorelabel
文件只是导致启动脚本restorecon -r -v /
在启动时运行,然后再次重新启动。(实际上,它运行一些fixfiles
打印大量点的调用,但由于这只是前端,restorecon
我并不关心......)
你可以自己运行它而不需要重启,这通常是我的第一的尝试诊断奇怪的 SELinux 问题时,这是步骤之一。请记住,原因重启的原因是更改安全上下文会影响正在运行的服务,因此至少应该重新启动受影响的服务(即重新启动 sshd)。
如果这做解决问题,那么在输出的某个地方,你会看到一个改变的安全上下文,这是问题的原因和解决方案。最有可能的是不是在/home
或/etc/selinux
。
答案2
起初我写了一个相对复杂的答案,它实际上只适用于 EL6,但后来我发现在你的情况下出现了一些非常奇怪的事情。
错误信息:
ssh_selinux_setup_pty: security_compute_relabel: Invalid argument
是很奇怪。我之所以这么说,是因为在 EL5 上,使用最新版本的 SSHD,该错误消息是不可能的。它不在源代码中。任何地方。我搜索了整个源代码树和“ssh_selinux_setup_pty”的 Redhat 补丁。它不在那里。
但它确实出现在 Fedora 18 上。
这让我认为你正在运行的 SSHD 版本不是它应该的版本,并且已被替换。 可能是你自己替换的,也可能是别人替换的。
更新 1
不起作用的关键部分的 SSHD 执行类似这样的操作(使用 python);我相信 sshd 中使用的 selinux 上下文正如您所提到的。
from selinux import *
sec_class = string_to_security_class("chr_file")
print security_compute_relabel("system_u:object_r:unconfined_t", \
"system_u:object_r:initrc_devpts_t", sec_class)
这应该返回:
[ 0,一些上下文内容 ]
您需要使用与 sshd 相同的上下文来运行它。“initrc_devpts_t”绝对正确。另一个上下文是您提供的引用用户上下文。
sshd 中的代码当前得到 -1,从而产生该错误。如果 sshd 中生成的用户上下文(参数 1)不正确,就会发生这种情况。
如果你可以让这个 python 在元组的第一个元素中不产生 -1,那么我唯一能建议的就是修改 sshd 源,在该函数中添加一个额外的调试行来找出原因真的上下文原来是在 sshds 配置中打开 debug3 日志记录。
在 openbsd-compat/port-linux.c: ssh_selinux_setup_pty
if (getfilecon(tty, &old_tty_ctx) == -1) {
error("%s: getfilecon: %s", __func__, strerror(errno));
goto out;
}
+debug3("%s: User context is %s, target tty is %s", __func__, user_ctx, old_tty_ctx);
if (security_compute_relabel(user_ctx, old_tty_ctx,
SECCLASS_CHR_FILE, &new_tty_ctx) != 0) {
error("%s: security_compute_relabel: %s",
__func__, strerror(errno));
goto out;
}
答案3
在目标策略中运行的 centos 7.2 中也遇到了同样的问题
Nov 14 17:34:41 server sshd[13863]: error: PAM: pam_open_session(): Cannot make/remove an entry for the specified session
Nov 14 17:34:42 server sshd[13863]: error: ssh_selinux_setup_pty: security_compute_relabel: Invalid argument
Nov 14 17:34:43 server sshd[13868]: Received disconnect from x.x.x.x: 11: disconnected by user
但参考自: http://www.unix.com/man-page/centos/8/sysadm_selinux/
semanage user -m -R 'staff_r sysadm_r system_r unconfined_r' sysadm_u
应该这样做。希望有帮助
答案4
请尝试以下操作:
# setsebool ssh_sysadm_login on
# setsebool -P ssh_sysadm_login on