Message ID | c9a8a0879bc9f375bb3484f8e86189a8af5aa142.1397831970.git.rgb@redhat.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Richard Guy Briggs <rgb@redhat.com> Date: Fri, 18 Apr 2014 13:34:06 -0400 > @@ -1449,6 +1453,26 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, > if (!nladdr->nl_groups && (nlk->groups == NULL || !(u32)nlk->groups[0])) > return 0; > > + if (nlk->netlink_bind && nladdr->nl_groups) { > + int i; > + > + for (i = 0; i < nlk->ngroups; i++) { > + int undo; > + > + if (!test_bit(i, (long unsigned int *)&nladdr->nl_groups)) > + continue; > + err = nlk->netlink_bind(i); > + if (!err) > + continue; > + if (!nlk->portid) > + netlink_remove(sk); > + for (undo = 0; undo < i; undo++) > + if (nlk->netlink_unbind) > + nlk->netlink_unbind(undo); > + return err; > + } > + } > + It took me a while to figure out why you need to do the netlink_remove() in the error path. I think it's really asking for trouble to allow the socket to have temporary visibility if we end up signalling an error. It seems safest if we only do the autobind/insert once we are absolutely certain that the bind() will fully succeed. This means that you have to do this bind validation loop before autobind/insert. Please make this change and resubmit this series, thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 14/04/22, David Miller wrote: > From: Richard Guy Briggs <rgb@redhat.com> > Date: Fri, 18 Apr 2014 13:34:06 -0400 > > > @@ -1449,6 +1453,26 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, > > if (!nladdr->nl_groups && (nlk->groups == NULL || !(u32)nlk->groups[0])) > > return 0; > > > > + if (nlk->netlink_bind && nladdr->nl_groups) { > > + int i; > > + > > + for (i = 0; i < nlk->ngroups; i++) { > > + int undo; > > + > > + if (!test_bit(i, (long unsigned int *)&nladdr->nl_groups)) > > + continue; > > + err = nlk->netlink_bind(i); > > + if (!err) > > + continue; > > + if (!nlk->portid) > > + netlink_remove(sk); > > + for (undo = 0; undo < i; undo++) > > + if (nlk->netlink_unbind) > > + nlk->netlink_unbind(undo); > > + return err; > > + } > > + } > > + > > It took me a while to figure out why you need to do the netlink_remove() in > the error path. > > I think it's really asking for trouble to allow the socket to have temporary > visibility if we end up signalling an error. The risk seems small, but I agree it is sloppy. > It seems safest if we only do the autobind/insert once we are absolutely > certain that the bind() will fully succeed. This means that you have to > do this bind validation loop before autobind/insert. Ok, done. This revision ends up being a bit cleaner than the previous one because I've refactored out the unbind loop into netlink_unbind() due to it needing to be called if the netlink_insert/autobind() fails as well. In the factorization process I noticed that unrequested groups were being unnecessarily unbound. It also provoked assigning the var "groups" from "nladdr->nl_groups" making things easier to read. > Please make this change and resubmit this series, thanks. Compiled and tested. New patchset to follow. - RGB -- Richard Guy Briggs <rbriggs@redhat.com> Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
This is a patch set Eric Paris and I have been working on to add a restricted capability read-only netlink multicast socket to kernel audit to enable userspace clients such as systemd/journald to receive audit logs, in addition to the bidirectional auditd userspace client. Currently, auditd has the CAP_AUDIT_CONTROL and CAP_AUDIT_WRITE capabilities (but uses CAP_NET_ADMIN). The CAP_AUDIT_READ capability will be added for use by read-only AUDIT_NLGRP_READLOG multicast group clients to the kaudit subsystem. This will remove the dependence on CAP_NET_ADMIN for the multicast read-only socket. Patches 1-3 provide a way for per-protocol bind functions to signal an error and to be able to clean up after themselves. The first netfilter cleanup patch has already been accepted by a netfilter maintainer, though I don't see it upstream yet, so it is included for completeness. The second patch adds the per-protocol bind function return code to signal to the netlink code that no further processing should be done and to undo the work already done. V1: This rev fixes a bug introduced by flattening the code in the last posting. *V2: This rev moves the per-protocol bind call above the socket exposure call and refactors out the unbind procedure. The third provides a way per protocol to undo bind actions on DROP. Patches 4-6 implement the audit multicast socket with capability checking. The fourth patch adds the bind function capability check to multicast join requests for audit. The fifth patch adds the audit log read multicast group. An assumption has been made that systemd/journald reside in the initial network namespace. This could be changed to check the actual network namespace of systemd/journald should this assumption no longer be true since audit now supports all network namespaces. This version of the patch now directly sends the broadcast when the packet is ready rather than waiting until it passes the queue. The sixth checks if any clients actually exist before sending. Since the net tree is busier than the audit tree, conflicts are more likely and the audit patches depend on the net patches, it is proposed to have the net tree carry this entire patchset for 3.16. Are the net maintainers ok with this? https://bugzilla.redhat.com/show_bug.cgi?id=887992 First posted: https://www.redhat.com/archives/linux-audit/2013-January/msg00008.html https://lkml.org/lkml/2013/1/27/279 Please find source for a test program at: http://people.redhat.com/rbriggs/audit-multicast-listen/ Richard Guy Briggs (6): netlink: simplify nfnetlink_bind netlink: have netlink per-protocol bind function return an error code. netlink: implement unbind to netlink_setsockopt NETLINK_DROP_MEMBERSHIP audit: add netlink audit protocol bind to check capabilities on multicast join audit: add netlink multicast group for log read audit: send multicast messages only if there are listeners include/linux/netlink.h | 3 +- include/uapi/linux/audit.h | 8 ++++ include/uapi/linux/capability.h | 7 +++- kernel/audit.c | 64 ++++++++++++++++++++++++++++++-- net/netfilter/nfnetlink.c | 10 ++--- net/netlink/af_netlink.c | 70 +++++++++++++++++++++++++---------- net/netlink/af_netlink.h | 6 ++- security/selinux/include/classmap.h | 2 +- 8 files changed, 135 insertions(+), 35 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Richard Guy Briggs <rgb@redhat.com> Date: Tue, 22 Apr 2014 21:31:52 -0400 > This is a patch set Eric Paris and I have been working on to add a restricted > capability read-only netlink multicast socket to kernel audit to enable > userspace clients such as systemd/journald to receive audit logs, in addition > to the bidirectional auditd userspace client. Series applied, thanks Richard. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 14/04/22, David Miller wrote: > From: Richard Guy Briggs <rgb@redhat.com> > Date: Tue, 22 Apr 2014 21:31:52 -0400 > > > This is a patch set Eric Paris and I have been working on to add a restricted > > capability read-only netlink multicast socket to kernel audit to enable > > userspace clients such as systemd/journald to receive audit logs, in addition > > to the bidirectional auditd userspace client. > > Series applied, thanks Richard. Thanks for your patience, David. Can I assume you adopted the 3 audit patches too, becuase of the dependence? - RGB -- Richard Guy Briggs <rbriggs@redhat.com> Senior Software Engineer, Kernel Security, AMER ENG Base Operating Systems, Red Hat Remote, Ottawa, Canada Voice: +1.647.777.2635, Internal: (81) 32635, Alt: +1.613.693.0684x3545 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tuesday, April 22, 2014 09:31:52 PM Richard Guy Briggs wrote: > This is a patch set Eric Paris and I have been working on to add a > restricted capability read-only netlink multicast socket to kernel audit to > enable userspace clients such as systemd/journald to receive audit logs, in > addition to the bidirectional auditd userspace client. Do have the ability to separate of secadm_r and sysadm_r? By allowing this, we will leak to a sysadmin that he is being audited by the security officer. In a lot of cases, they are one in the same person. But for others, they are not. I have a feeling this will cause problems for MLS systems. Also, shouldn't we have an audit event for every attempt to connect to this socket? We really need to know where this information is getting leaked to. -Steve > Currently, auditd has the CAP_AUDIT_CONTROL and CAP_AUDIT_WRITE capabilities > (but uses CAP_NET_ADMIN). The CAP_AUDIT_READ capability will be added for > use by read-only AUDIT_NLGRP_READLOG multicast group clients to the kaudit > subsystem. This will remove the dependence on CAP_NET_ADMIN for the > multicast read-only socket. > > > Patches 1-3 provide a way for per-protocol bind functions to > signal an error and to be able to clean up after themselves. > > The first netfilter cleanup patch has already been accepted by a netfilter > maintainer, though I don't see it upstream yet, so it is included for > completeness. > > The second patch adds the per-protocol bind function return code to signal > to the netlink code that no further processing should be done and to undo > the work already done. > V1: This rev fixes a bug introduced by flattening the code in the last > posting. *V2: This rev moves the per-protocol bind call above the socket > exposure call and refactors out the unbind procedure. > > The third provides a way per protocol to undo bind actions on DROP. > > > Patches 4-6 implement the audit multicast socket with capability checking. > > The fourth patch adds the bind function capability check to multicast join > requests for audit. > > The fifth patch adds the audit log read multicast group. An assumption has > been made that systemd/journald reside in the initial network namespace. > This could be changed to check the actual network namespace of > systemd/journald should this assumption no longer be true since audit now > supports all network namespaces. This version of the patch now directly > sends the broadcast when the packet is ready rather than waiting until it > passes the queue. > > The sixth checks if any clients actually exist before sending. > > > Since the net tree is busier than the audit tree, conflicts are more likely > and the audit patches depend on the net patches, it is proposed to have the > net tree carry this entire patchset for 3.16. Are the net maintainers ok > with this? > > > https://bugzilla.redhat.com/show_bug.cgi?id=887992 > > First posted: > https://www.redhat.com/archives/linux-audit/2013-January/msg00008.html > https://lkml.org/lkml/2013/1/27/279 > > Please find source for a test program at: > http://people.redhat.com/rbriggs/audit-multicast-listen/ > > > Richard Guy Briggs (6): > netlink: simplify nfnetlink_bind > netlink: have netlink per-protocol bind function return an error > code. > netlink: implement unbind to netlink_setsockopt > NETLINK_DROP_MEMBERSHIP > audit: add netlink audit protocol bind to check capabilities on > multicast join > audit: add netlink multicast group for log read > audit: send multicast messages only if there are listeners > > include/linux/netlink.h | 3 +- > include/uapi/linux/audit.h | 8 ++++ > include/uapi/linux/capability.h | 7 +++- > kernel/audit.c | 64 ++++++++++++++++++++++++++++++-- > net/netfilter/nfnetlink.c | 10 ++--- > net/netlink/af_netlink.c | 70 > +++++++++++++++++++++++++---------- net/netlink/af_netlink.h | > 6 ++- > security/selinux/include/classmap.h | 2 +- > 8 files changed, 135 insertions(+), 35 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Richard Guy Briggs <rgb@redhat.com> Date: Tue, 22 Apr 2014 21:49:29 -0400 > On 14/04/22, David Miller wrote: >> From: Richard Guy Briggs <rgb@redhat.com> >> Date: Tue, 22 Apr 2014 21:31:52 -0400 >> >> > This is a patch set Eric Paris and I have been working on to add a restricted >> > capability read-only netlink multicast socket to kernel audit to enable >> > userspace clients such as systemd/journald to receive audit logs, in addition >> > to the bidirectional auditd userspace client. >> >> Series applied, thanks Richard. > > Thanks for your patience, David. Can I assume you adopted the 3 audit > patches too, becuase of the dependence? Yes. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, 2014-04-22 at 22:25 -0400, Steve Grubb wrote: > On Tuesday, April 22, 2014 09:31:52 PM Richard Guy Briggs wrote: > > This is a patch set Eric Paris and I have been working on to add a > > restricted capability read-only netlink multicast socket to kernel audit to > > enable userspace clients such as systemd/journald to receive audit logs, in > > addition to the bidirectional auditd userspace client. > > Do have the ability to separate of secadm_r and sysadm_r? By allowing this, we > will leak to a sysadmin that he is being audited by the security officer. In a > lot of cases, they are one in the same person. But for others, they are not. I > have a feeling this will cause problems for MLS systems. Why? This requires CAP_AUDIT_READ. Just don't give CAP_AUDIT_READ to places you don't want to have read permission. Exactly the same as you don't give CAP_AUDIT_CONTROL to sysadm_r. (If we are giving CAP_AUDIT_CONTROL to sysadm_r and you think that any file protections on /var/log/audit/audit.log are adequate we are fooling ourselves!) > Also, shouldn't we have an audit event for every attempt to connect to this > socket? We really need to know where this information is getting leaked to. We certainly can. What would you like to see in that event? -Eric -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Here are the capabilities we currently give to sysadm_t with sysadm_secadm 1.0.0 Disabled allow sysadm_t sysadm_t : capability { chown dac_override dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; cap_audit_write might be a problem? On 04/22/2014 11:57 PM, Eric Paris wrote: > On Tue, 2014-04-22 at 22:25 -0400, Steve Grubb wrote: >> On Tuesday, April 22, 2014 09:31:52 PM Richard Guy Briggs wrote: >>> This is a patch set Eric Paris and I have been working on to add a >>> restricted capability read-only netlink multicast socket to kernel audit to >>> enable userspace clients such as systemd/journald to receive audit logs, in >>> addition to the bidirectional auditd userspace client. >> Do have the ability to separate of secadm_r and sysadm_r? By allowing this, we >> will leak to a sysadmin that he is being audited by the security officer. In a >> lot of cases, they are one in the same person. But for others, they are not. I >> have a feeling this will cause problems for MLS systems. > Why? This requires CAP_AUDIT_READ. Just don't give CAP_AUDIT_READ to > places you don't want to have read permission. Exactly the same as you > don't give CAP_AUDIT_CONTROL to sysadm_r. (If we are giving > CAP_AUDIT_CONTROL to sysadm_r and you think that any file protections > on /var/log/audit/audit.log are adequate we are fooling ourselves!) > >> Also, shouldn't we have an audit event for every attempt to connect to this >> socket? We really need to know where this information is getting leaked to. > We certainly can. What would you like to see in that event? > > -Eric > > _______________________________________________ > Selinux mailing list > Selinux@tycho.nsa.gov > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: > Here are the capabilities we currently give to sysadm_t with > sysadm_secadm 1.0.0 Disabled > > allow sysadm_t sysadm_t : capability { chown dac_override > dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable > net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner > sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice > sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; > allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } > > allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; > > cap_audit_write might be a problem? cap_audit_write is fine. syslogd_t (aka journal) is going to need the new permission cap_audit_read. Also, as steve pointed out, someone may be likely to want to be able to disable that permission easily. -Eric -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
I guess the problem would be that the sysadm_t would be able to look at the journal which would now contain the audit content. On 04/23/2014 10:42 AM, Eric Paris wrote: > On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: >> Here are the capabilities we currently give to sysadm_t with >> sysadm_secadm 1.0.0 Disabled >> >> allow sysadm_t sysadm_t : capability { chown dac_override >> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable >> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner >> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice >> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; >> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } >> >> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; >> >> cap_audit_write might be a problem? > cap_audit_write is fine. > > syslogd_t (aka journal) is going to need the new permission > cap_audit_read. Also, as steve pointed out, someone may be likely to > want to be able to disable that permission easily. > > -Eric > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, 2014-04-23 at 11:36 -0400, Daniel J Walsh wrote: > I guess the problem would be that the sysadm_t would be able to look at > the journal which would now contain the audit content. right. so include it in the sysadm_secadm bool > > On 04/23/2014 10:42 AM, Eric Paris wrote: > > On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: > >> Here are the capabilities we currently give to sysadm_t with > >> sysadm_secadm 1.0.0 Disabled > >> > >> allow sysadm_t sysadm_t : capability { chown dac_override > >> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable > >> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner > >> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice > >> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; > >> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } > >> > >> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; > >> > >> cap_audit_write might be a problem? > > cap_audit_write is fine. > > > > syslogd_t (aka journal) is going to need the new permission > > cap_audit_read. Also, as steve pointed out, someone may be likely to > > want to be able to disable that permission easily. > > > > -Eric > > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Meaning looking at the journal would be equivalent to looking at /var/log/audit/audit.log. On 04/23/2014 11:37 AM, Eric Paris wrote: > On Wed, 2014-04-23 at 11:36 -0400, Daniel J Walsh wrote: >> I guess the problem would be that the sysadm_t would be able to look at >> the journal which would now contain the audit content. > right. so include it in the sysadm_secadm bool > >> On 04/23/2014 10:42 AM, Eric Paris wrote: >>> On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: >>>> Here are the capabilities we currently give to sysadm_t with >>>> sysadm_secadm 1.0.0 Disabled >>>> >>>> allow sysadm_t sysadm_t : capability { chown dac_override >>>> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable >>>> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner >>>> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice >>>> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; >>>> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } >>>> >>>> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; >>>> >>>> cap_audit_write might be a problem? >>> cap_audit_write is fine. >>> >>> syslogd_t (aka journal) is going to need the new permission >>> cap_audit_read. Also, as steve pointed out, someone may be likely to >>> want to be able to disable that permission easily. >>> >>> -Eric >>> > > _______________________________________________ > Selinux mailing list > Selinux@tycho.nsa.gov > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
They would be equivalent if and only if journald had CAP_AUDIT_READ. I suggest you take CAP_AUDIT_READ away from journald on systems which need the secadm/sysadmin split (which is a ridiculously stupid split anyway, but who am I to complain?) On Wed, Apr 23, 2014 at 11:52 AM, Daniel J Walsh <dwalsh@redhat.com> wrote: > Meaning looking at the journal would be equivalent to looking at > /var/log/audit/audit.log. > > > On 04/23/2014 11:37 AM, Eric Paris wrote: >> On Wed, 2014-04-23 at 11:36 -0400, Daniel J Walsh wrote: >>> I guess the problem would be that the sysadm_t would be able to look at >>> the journal which would now contain the audit content. >> right. so include it in the sysadm_secadm bool >> >>> On 04/23/2014 10:42 AM, Eric Paris wrote: >>>> On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: >>>>> Here are the capabilities we currently give to sysadm_t with >>>>> sysadm_secadm 1.0.0 Disabled >>>>> >>>>> allow sysadm_t sysadm_t : capability { chown dac_override >>>>> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable >>>>> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner >>>>> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice >>>>> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; >>>>> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } >>>>> >>>>> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; >>>>> >>>>> cap_audit_write might be a problem? >>>> cap_audit_write is fine. >>>> >>>> syslogd_t (aka journal) is going to need the new permission >>>> cap_audit_read. Also, as steve pointed out, someone may be likely to >>>> want to be able to disable that permission easily. >>>> >>>> -Eric >>>> >> >> _______________________________________________ >> Selinux mailing list >> Selinux@tycho.nsa.gov >> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. >> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. >> >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
I don't disagree. I would think the real solution to this would be to not allow sysadm_t to get to SystemHigh, where all of the logging data will be stored. On 04/24/2014 09:22 AM, Eric Paris wrote: > They would be equivalent if and only if journald had CAP_AUDIT_READ. > > I suggest you take CAP_AUDIT_READ away from journald on systems which > need the secadm/sysadmin split (which is a ridiculously stupid split > anyway, but who am I to complain?) > > On Wed, Apr 23, 2014 at 11:52 AM, Daniel J Walsh <dwalsh@redhat.com> wrote: >> Meaning looking at the journal would be equivalent to looking at >> /var/log/audit/audit.log. >> >> >> On 04/23/2014 11:37 AM, Eric Paris wrote: >>> On Wed, 2014-04-23 at 11:36 -0400, Daniel J Walsh wrote: >>>> I guess the problem would be that the sysadm_t would be able to look at >>>> the journal which would now contain the audit content. >>> right. so include it in the sysadm_secadm bool >>> >>>> On 04/23/2014 10:42 AM, Eric Paris wrote: >>>>> On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: >>>>>> Here are the capabilities we currently give to sysadm_t with >>>>>> sysadm_secadm 1.0.0 Disabled >>>>>> >>>>>> allow sysadm_t sysadm_t : capability { chown dac_override >>>>>> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable >>>>>> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner >>>>>> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice >>>>>> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; >>>>>> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } >>>>>> >>>>>> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; >>>>>> >>>>>> cap_audit_write might be a problem? >>>>> cap_audit_write is fine. >>>>> >>>>> syslogd_t (aka journal) is going to need the new permission >>>>> cap_audit_read. Also, as steve pointed out, someone may be likely to >>>>> want to be able to disable that permission easily. >>>>> >>>>> -Eric >>>>> >>> _______________________________________________ >>> Selinux mailing list >>> Selinux@tycho.nsa.gov >>> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. >>> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. >>> >>> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://www.tux.org/lkml/ > _______________________________________________ > Selinux mailing list > Selinux@tycho.nsa.gov > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2014-04-24 at 10:59 -0400, Daniel J Walsh wrote: > I don't disagree. I would think the real solution to this would be to > not allow sysadm_t to get to SystemHigh, where all of the logging data > will be stored. make journalctl a userspace object manager and do selinux checks on if it can see individual records? so secadm_t running journalctl would see them and sysadm running journalctl wouldn't see them? Sounds elegant. Who is going to code it? *NOT IT!* > > On 04/24/2014 09:22 AM, Eric Paris wrote: > > They would be equivalent if and only if journald had CAP_AUDIT_READ. > > > > I suggest you take CAP_AUDIT_READ away from journald on systems which > > need the secadm/sysadmin split (which is a ridiculously stupid split > > anyway, but who am I to complain?) > > > > On Wed, Apr 23, 2014 at 11:52 AM, Daniel J Walsh <dwalsh@redhat.com> wrote: > >> Meaning looking at the journal would be equivalent to looking at > >> /var/log/audit/audit.log. > >> > >> > >> On 04/23/2014 11:37 AM, Eric Paris wrote: > >>> On Wed, 2014-04-23 at 11:36 -0400, Daniel J Walsh wrote: > >>>> I guess the problem would be that the sysadm_t would be able to look at > >>>> the journal which would now contain the audit content. > >>> right. so include it in the sysadm_secadm bool > >>> > >>>> On 04/23/2014 10:42 AM, Eric Paris wrote: > >>>>> On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: > >>>>>> Here are the capabilities we currently give to sysadm_t with > >>>>>> sysadm_secadm 1.0.0 Disabled > >>>>>> > >>>>>> allow sysadm_t sysadm_t : capability { chown dac_override > >>>>>> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable > >>>>>> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner > >>>>>> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice > >>>>>> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; > >>>>>> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } > >>>>>> > >>>>>> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; > >>>>>> > >>>>>> cap_audit_write might be a problem? > >>>>> cap_audit_write is fine. > >>>>> > >>>>> syslogd_t (aka journal) is going to need the new permission > >>>>> cap_audit_read. Also, as steve pointed out, someone may be likely to > >>>>> want to be able to disable that permission easily. > >>>>> > >>>>> -Eric > >>>>> > >>> _______________________________________________ > >>> Selinux mailing list > >>> Selinux@tycho.nsa.gov > >>> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > >>> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. > >>> > >>> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > >> the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > >> Please read the FAQ at http://www.tux.org/lkml/ > > _______________________________________________ > > Selinux mailing list > > Selinux@tycho.nsa.gov > > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > > To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. > > > > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Yes that would be the long term fix. But it would involve journal labelling individual data records. IE Records from audit.log would be audit_log_t, while messages from syslog would be var_log_t, Or some other kind of crazyness. On 04/24/2014 11:03 AM, Eric Paris wrote: > On Thu, 2014-04-24 at 10:59 -0400, Daniel J Walsh wrote: >> I don't disagree. I would think the real solution to this would be to >> not allow sysadm_t to get to SystemHigh, where all of the logging data >> will be stored. > make journalctl a userspace object manager and do selinux checks on if > it can see individual records? so secadm_t running journalctl would see > them and sysadm running journalctl wouldn't see them? > > Sounds elegant. Who is going to code it? *NOT IT!* > >> On 04/24/2014 09:22 AM, Eric Paris wrote: >>> They would be equivalent if and only if journald had CAP_AUDIT_READ. >>> >>> I suggest you take CAP_AUDIT_READ away from journald on systems which >>> need the secadm/sysadmin split (which is a ridiculously stupid split >>> anyway, but who am I to complain?) >>> >>> On Wed, Apr 23, 2014 at 11:52 AM, Daniel J Walsh <dwalsh@redhat.com> wrote: >>>> Meaning looking at the journal would be equivalent to looking at >>>> /var/log/audit/audit.log. >>>> >>>> >>>> On 04/23/2014 11:37 AM, Eric Paris wrote: >>>>> On Wed, 2014-04-23 at 11:36 -0400, Daniel J Walsh wrote: >>>>>> I guess the problem would be that the sysadm_t would be able to look at >>>>>> the journal which would now contain the audit content. >>>>> right. so include it in the sysadm_secadm bool >>>>> >>>>>> On 04/23/2014 10:42 AM, Eric Paris wrote: >>>>>>> On Wed, 2014-04-23 at 09:40 -0400, Daniel J Walsh wrote: >>>>>>>> Here are the capabilities we currently give to sysadm_t with >>>>>>>> sysadm_secadm 1.0.0 Disabled >>>>>>>> >>>>>>>> allow sysadm_t sysadm_t : capability { chown dac_override >>>>>>>> dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable >>>>>>>> net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner >>>>>>>> sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice >>>>>>>> sys_resource sys_time sys_tty_config mknod lease audit_write setfcap } ; >>>>>>>> allow sysadm_t sysadm_t : capability { setgid setuid sys_chroot } >>>>>>>> >>>>>>>> allow sysadm_t sysadm_t : capability2 { syslog block_suspend } ; >>>>>>>> >>>>>>>> cap_audit_write might be a problem? >>>>>>> cap_audit_write is fine. >>>>>>> >>>>>>> syslogd_t (aka journal) is going to need the new permission >>>>>>> cap_audit_read. Also, as steve pointed out, someone may be likely to >>>>>>> want to be able to disable that permission easily. >>>>>>> >>>>>>> -Eric >>>>>>> >>>>> _______________________________________________ >>>>> Selinux mailing list >>>>> Selinux@tycho.nsa.gov >>>>> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. >>>>> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. >>>>> >>>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >>>> the body of a message to majordomo@vger.kernel.org >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> Please read the FAQ at http://www.tux.org/lkml/ >>> _______________________________________________ >>> Selinux mailing list >>> Selinux@tycho.nsa.gov >>> To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. >>> To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. >>> >>> > > _______________________________________________ > Selinux mailing list > Selinux@tycho.nsa.gov > To unsubscribe, send email to Selinux-leave@tycho.nsa.gov. > To get help, send an email containing "help" to Selinux-request@tycho.nsa.gov. > > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index aad8eea..5146ce0 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -45,7 +45,8 @@ struct netlink_kernel_cfg { unsigned int flags; void (*input)(struct sk_buff *skb); struct mutex *cb_mutex; - void (*bind)(int group); + int (*bind)(int group); + void (*unbind)(int group); bool (*compare)(struct net *net, struct sock *sk); }; diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 0df800a..6e42dcf 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -400,7 +400,7 @@ static void nfnetlink_rcv(struct sk_buff *skb) } #ifdef CONFIG_MODULES -static void nfnetlink_bind(int group) +static int nfnetlink_bind(int group) { const struct nfnetlink_subsystem *ss; int type = nfnl_group2type[group]; @@ -410,6 +410,7 @@ static void nfnetlink_bind(int group) rcu_read_unlock(); if (!ss) request_module("nfnetlink-subsys-%d", type); + return 0; } #endif diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 894cda0..3f43e5a 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1206,7 +1206,8 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, struct module *module = NULL; struct mutex *cb_mutex; struct netlink_sock *nlk; - void (*bind)(int group); + int (*bind)(int group); + void (*unbind)(int group); int err = 0; sock->state = SS_UNCONNECTED; @@ -1232,6 +1233,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, err = -EPROTONOSUPPORT; cb_mutex = nl_table[protocol].cb_mutex; bind = nl_table[protocol].bind; + unbind = nl_table[protocol].unbind; netlink_unlock_table(); if (err < 0) @@ -1248,6 +1250,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol, nlk = nlk_sk(sock->sk); nlk->module = module; nlk->netlink_bind = bind; + nlk->netlink_unbind = unbind; out: return err; @@ -1301,6 +1304,7 @@ static int netlink_release(struct socket *sock) kfree_rcu(old, rcu); nl_table[sk->sk_protocol].module = NULL; nl_table[sk->sk_protocol].bind = NULL; + nl_table[sk->sk_protocol].unbind = NULL; nl_table[sk->sk_protocol].flags = 0; nl_table[sk->sk_protocol].registered = 0; } @@ -1449,6 +1453,26 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, if (!nladdr->nl_groups && (nlk->groups == NULL || !(u32)nlk->groups[0])) return 0; + if (nlk->netlink_bind && nladdr->nl_groups) { + int i; + + for (i = 0; i < nlk->ngroups; i++) { + int undo; + + if (!test_bit(i, (long unsigned int *)&nladdr->nl_groups)) + continue; + err = nlk->netlink_bind(i); + if (!err) + continue; + if (!nlk->portid) + netlink_remove(sk); + for (undo = 0; undo < i; undo++) + if (nlk->netlink_unbind) + nlk->netlink_unbind(undo); + return err; + } + } + netlink_table_grab(); netlink_update_subscriptions(sk, nlk->subscriptions + hweight32(nladdr->nl_groups) - @@ -1457,15 +1481,6 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, netlink_update_listeners(sk); netlink_table_ungrab(); - if (nlk->netlink_bind && nlk->groups[0]) { - int i; - - for (i = 0; i < nlk->ngroups; i++) { - if (test_bit(i, nlk->groups)) - nlk->netlink_bind(i); - } - } - return 0; } @@ -2103,14 +2118,16 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, return err; if (!val || val - 1 >= nlk->ngroups) return -EINVAL; + if (nlk->netlink_bind) { + err = nlk->netlink_bind(val); + if (err) + return err; + } netlink_table_grab(); netlink_update_socket_mc(nlk, val, optname == NETLINK_ADD_MEMBERSHIP); netlink_table_ungrab(); - if (nlk->netlink_bind) - nlk->netlink_bind(val); - err = 0; break; } diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index ed13a79..0b59d44 100644 --- a/net/netlink/af_netlink.h +++ b/net/netlink/af_netlink.h @@ -38,7 +38,8 @@ struct netlink_sock { struct mutex *cb_mutex; struct mutex cb_def_mutex; void (*netlink_rcv)(struct sk_buff *skb); - void (*netlink_bind)(int group); + int (*netlink_bind)(int group); + void (*netlink_unbind)(int group); struct module *module; #ifdef CONFIG_NETLINK_MMAP struct mutex pg_vec_lock; @@ -74,7 +75,8 @@ struct netlink_table { unsigned int groups; struct mutex *cb_mutex; struct module *module; - void (*bind)(int group); + int (*bind)(int group); + void (*unbind)(int group); bool (*compare)(struct net *net, struct sock *sock); int registered; };
Have the netlink per-protocol optional bind function return an int error code rather than void to signal a failure. This will enable netlink protocols to perform extra checks including capabilities and permissions verifications when updating memberships in multicast groups. In netlink_bind() and netlink_setsockopt() the call to the per-protocol bind function was moved above the multicast group update to prevent any access to the multicast socket groups before checking with the per-protocol bind function. This will enable the per-protocol bind function to be used to check permissions which could be denied before making them available, and to avoid the messy job of undoing the addition should the per-protocol bind function fail. The netfilter subsystem seems to be the only one currently using the per-protocol bind function. Signed-off-by: Richard Guy Briggs <rgb@redhat.com> --- In particular, the audit subsystem (NETLINK_AUDIT protocol) could benefit by being able to check specific capabilities for each multicast group before granting membership to the requesting socket. Currently, all NETLINK_AUDIT sockets must have the capability CAP_NET_ADMIN. No other capabilities are required to join a multicast group. This capability is too broad allowing access to this socket by many applications that must not have access to this information. It is proposed to add capability CAP_AUDIT_READ to allow this access while dropping the exessively broad capability CAP_NET_ADMIN. There has also been some interest expressed by IETF ForCES folk. --- include/linux/netlink.h | 3 ++- net/netfilter/nfnetlink.c | 3 ++- net/netlink/af_netlink.c | 43 ++++++++++++++++++++++++++++++------------- net/netlink/af_netlink.h | 6 ++++-- 4 files changed, 38 insertions(+), 17 deletions(-)