This boolean brings into conflict two of my top goals with SELinux.
1. Make the system secure by default.The problem with most security systems is NO ONE turns them on. NO ONE increases the security of their system.
Now while these are exaggerations, I would bet you that 99 % of SELinux users never turn on
confined users, or
disable the unconfined module . There are large numbers of people who run SELinux in permissive mode or even disabled. If we shipped Fedora and RHEL with SELinux disabled, I would bet the number of people who would enable it would be infinitesimally small. So when I add a feature, I always think about how it would help the vast majority of people. Will this boolean make my Wife's computer more secure.
2. Keep the unconfined domain unconfined...Read the blog for why uses expect things to just work, especially from their logged in accounts, especially if they are the admin.
Should deny_ptrace be on by default????Well deny_ptrace actually confines the unconfined domain, so it conflicts with #2, but if I don't turn it on, for the most part people will not take advantage. Most users would not see the benefit. Right now I am going to turn it on by default (Of course I reserve the right to change my mind, or be beaten into submission.) Any person who wants to disable it permanently can execute.
# setsebool -P deny_ptrace 0Programmers and system admins if you get a "permission denied" or "Operation not supported" error with ptrace, strace or gdb, it is SELinux causing the problem, and if you need to debug a problem, you can turn the boolean on temporarily.
# setsebool deny_ptrace 0And do your thing.
Since sysadmins and programmers understand Linux best, it would be easier for them to toggle the security feature.
Now some questions about this feature.What happened to allow_ptrace boolean in RHEL versions and older Fedora's? I originally thought about extending allow_ptrace, but I thought I had better just create a new boolean and remove the old.
allow_ptrace only effected confined users. But since hardly anyone used confined users, I thought I needed a better way to describe the feature, and change its name. I have removed allow_ptrace and now deny_ptrace will remove all ptrace, sys_ptrace that I know about from the system.
Does deny_ptrace guarantee no domains on my system can ptrace another domain? NO
If you load a custom policy with an "allow XYZ self:process ptrace", this boolean will not effect it. So it only effects actually policy shipped by Fedora or Red Hat.
deny_ptrace does not effect permissive domains, or permissive mode (obviously), so if you want to make sure no processes can execute ptrace, you need to
disable permissive domains.
After you turn on the deny_ptrace boolean, you can check if any domains are still able to ptrace by executing
# sesearch -A -C -p ptrace,sys_ptrace | grep -v ^DWhat about separation between root and users?
Well SELinux does not know anything about UID users, so root and non root mean nothing to SELinux. The only way to get this distinction is by setting up confined users and then say run as staff_t as non root and then transition to unconfined_t, or sysadm_t or a confined admin type. But since hardly anyone uses confined users, this is not an option, if I want to make most computers more secure.
Could you add a bunch of booleans that allows us to turn on and off ptrace per confined domain?
Well this is not really necessary, since most confined domains can not ptrace now, or only could ptrace because of some bugs in the kernel that generated ptrace avc's when running the ps command as root or if a process examined the /proc/PID files of another process. We have fixed these kernel issues and are removing most domains ability to ptrace permanently, Ie turning deny_ptrace off DOES not allow every domain the ability to ptrace, only a few select domains that we believe might need it. (Really just user domains.)
In Fedora 14 (and possibly other versions) sshd runs under "sshd_t" and can only writelocations with certain SELinux labels. One such label is "var_auth_t" and the default policy sets this label on "/var/run/user/" Therefore, the following config works:
# If the user is NOT in group "otp_users", skip next module auth [success=1 default=ignore] pam_succeed_if.so user notingroup otp_users auth required pam_google_authenticator.so secret=/var/run/user/${USER}/.google_authenticator auth include password-auth