Hi,

I've have a workable configuration to authenticate via kerberos with
pam_krb5 and pam_ccreds to cache passwords for offline logins.

in nixos/modules/config/krb5.nix, I install the default kerberos defined
in nixpkgs instead of krb5 (MIT version).

-    systemPackages = [ pkgs.krb5 ];
+    systemPackages = [ pkgs.kerberos ];

Marco (and others), is there a reason to specify krb5 instead of heimdal?
Maybe we need a better way to specify the kerberos implementation.
-- 
Regards, David
>From 24afdf62d3957c991e141b325063e368def6d84e Mon Sep 17 00:00:00 2001
From: David Guibert <[email protected]>
Date: Mon, 22 Feb 2010 08:47:47 +0100
Subject: [PATCH 1/2] nixos: kerberos services for the server.

---
 modules/module-list.nix                |    1 +
 modules/services/networking/xinetd.nix |    7 +++
 modules/services/system/kerberos.nix   |   71 ++++++++++++++++++++++++++++++++
 3 files changed, 79 insertions(+), 0 deletions(-)
 create mode 100644 modules/services/system/kerberos.nix

diff --git a/modules/module-list.nix b/modules/module-list.nix
index 8e12fd1..9f0253a 100644
--- a/modules/module-list.nix
+++ b/modules/module-list.nix
@@ -107,6 +107,7 @@
   ./services/system/dbus.nix
   ./services/system/nscd.nix
   ./services/system/uptimed.nix
+  ./services/system/kerberos.nix
   ./services/ttys/gpm.nix
   ./services/ttys/mingetty.nix
   ./services/web-servers/apache-httpd/default.nix
diff --git a/modules/services/networking/xinetd.nix 
b/modules/services/networking/xinetd.nix
index 4729ba9..5b74d7e 100644
--- a/modules/services/networking/xinetd.nix
+++ b/modules/services/networking/xinetd.nix
@@ -26,6 +26,7 @@ let
       {
         protocol    = ${srv.protocol}
         ${optionalString srv.unlisted "type        = UNLISTED"}
+        ${optionalString (srv.flags != "") "flags = ${srv.flags}"}
         socket_type = ${if srv.protocol == "udp" then "dgram" else "stream"}
         ${if srv.port != 0 then "port        = ${toString srv.port}" else ""}
         wait        = ${if srv.protocol == "udp" then "yes" else "no"}
@@ -98,6 +99,12 @@ in
           description = "Command-line arguments for the server program.";
         };
 
+        flags = mkOption {
+          type = types.string;
+          default = "";
+          description = "";
+        };
+
         unlisted = mkOption {
           type = types.bool;
           default = false;
diff --git a/modules/services/system/kerberos.nix 
b/modules/services/system/kerberos.nix
new file mode 100644
index 0000000..4ca9a01
--- /dev/null
+++ b/modules/services/system/kerberos.nix
@@ -0,0 +1,71 @@
+{pkgs, config, ...}:
+
+let
+
+  inherit (pkgs.lib) mkOption mkIf singleton;
+
+  inherit (pkgs) heimdal;
+
+  stateDir = "/var/heimdal";
+in
+
+{
+
+  ###### interface
+  
+  options = {
+  
+    services.kerberos_server = {
+
+      enable = mkOption {
+        default = false;
+        description = ''
+          Enable the kerberos authentification server.
+        '';
+      };
+
+    };
+
+  };
+
+
+  ###### implementation
+
+  config = mkIf config.services.kerberos_server.enable {
+  
+    environment.systemPackages = [ heimdal ];
+  
+    services.xinetd.enable = true;
+    services.xinetd.services = pkgs.lib.singleton
+      { name = "kerberos-adm";
+        flags = "REUSE NAMEINARGS";
+        protocol = "tcp";
+        user = "root";
+        server = "${pkgs.tcpWrapper}/sbin/tcpd";
+        serverArgs = "${pkgs.heimdal}/sbin/kadmind";
+      };
+
+    jobs.kdc =
+      { description = "Kerberos Domain Controller daemon";
+
+        startOn = "ip-up";
+
+        preStart =
+          ''
+            mkdir -m 0755 -p ${stateDir}
+          '';
+
+        exec = "${heimdal}/sbin/kdc";
+
+      };
+
+    jobs.kpasswdd =
+      { description = "Kerberos Domain Controller daemon";
+
+        startOn = "ip-up";
+
+        exec = "${heimdal}/sbin/kpasswdd";
+      };
+  };
+  
+}
-- 
1.7.1

>From 005392ff3225ab2b0843b4f843de64cd3569604d Mon Sep 17 00:00:00 2001
From: David Guibert <[email protected]>
Date: Sun, 21 Feb 2010 21:56:58 +0100
Subject: [PATCH 2/2] nixos: authenticate through kerberos

config.krb5.enable needs to be set as true.
Also use pam_ccreds to cache Kerberos credentials for offline logins.
---
 modules/config/krb5.nix  |   30 +++++++++++++++++++++++++-----
 modules/security/pam.nix |   16 ++++++++++++++--
 2 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/modules/config/krb5.nix b/modules/config/krb5.nix
index 6543bba..5fc75bc 100644
--- a/modules/config/krb5.nix
+++ b/modules/config/krb5.nix
@@ -6,8 +6,6 @@ let
 
   cfg = config.krb5;
 
-  #myPkgs = import /home/nixer/nix/my-expr.nix { system = "x86_64-linux"; };
-
   options = {
     krb5 = {
 
@@ -21,6 +19,11 @@ let
         description = "Default realm.";
       };
 
+      domainRealm = mkOption {
+        default = "atena.mit.edu";
+        description = "Default domain realm.";
+      };
+
       kdc = mkOption {
         default = "kerberos.mit.edu";
         description = "Kerberos Domain Controller";
@@ -43,12 +46,13 @@ mkIf config.krb5.enable {
   ];
 
   environment = {
-    systemPackages = [ pkgs.krb5 ];
+    systemPackages = [ pkgs.kerberos ];
     etc = [
       { source = pkgs.writeText "krb5.conf"
           ''
 [libdefaults]
     default_realm = ${cfg.defaultRealm}
+    encrypt = true
 
 # The following krb5.conf variables are only for MIT Kerberos.
     krb4_config = /etc/krb.conf
@@ -84,6 +88,7 @@ mkIf config.krb5.enable {
     ${cfg.defaultRealm} = {
         kdc = ${cfg.kdc}
         admin_server = ${cfg.kerberosAdminServer}
+#        kpasswd_server = ${cfg.kerberosAdminServer}
     }
     ATHENA.MIT.EDU = {
         kdc = kerberos.mit.edu:88
@@ -162,6 +167,8 @@ mkIf config.krb5.enable {
     }
 
 [domain_realm]
+    .${cfg.domainRealm} = ${cfg.defaultRealm}
+    ${cfg.domainRealm} = ${cfg.defaultRealm}
     .mit.edu = ATHENA.MIT.EDU
     mit.edu = ATHENA.MIT.EDU
     .media.mit.edu = MEDIA-LAB.MIT.EDU
@@ -172,10 +179,23 @@ mkIf config.krb5.enable {
     whoi.edu = ATHENA.MIT.EDU
     .stanford.edu = stanford.edu
 
-[login]
+[logging]
+    kdc = SYSLOG:INFO:DAEMON
+    admin_server = SYSLOG:INFO:DAEMON
+    default = SYSLOG:INFO:DAEMON
     krb4_convert = true
     krb4_get_tickets = false
-        
+
+
+[appdefaults]
+    pam = {
+        debug = false
+        ticket_lifetime = 36000
+        renew_lifetime = 36000
+        max_timeout = 30
+        timeout_shift = 2
+        initial_timeout = 1
+    }
           '';
         target = "krb5.conf";
       }
diff --git a/modules/security/pam.nix b/modules/security/pam.nix
index 2086814..5c59282 100644
--- a/modules/security/pam.nix
+++ b/modules/security/pam.nix
@@ -7,7 +7,7 @@ with pkgs.lib;
 
 let
 
-  inherit (pkgs) pam_usb pam_ldap;
+  inherit (pkgs) pam_usb pam_ldap pam_krb5 pam_ccreds;
 
   otherService = pkgs.writeText "other.pam"
     ''
@@ -63,6 +63,8 @@ let
           # Account management.
           ${optionalString config.users.ldap.enable
               "account optional ${pam_ldap}/lib/security/pam_ldap.so"}
+          ${optionalString config.krb5.enable
+              "account sufficient ${pam_krb5}/lib/security/pam_krb5.so"}
           account required pam_unix.so
 
           # Authentication management.
@@ -74,11 +76,18 @@ let
               "auth sufficient ${pam_ldap}/lib/security/pam_ldap.so"}
           auth sufficient pam_unix.so ${
             optionalString allowNullPassword "nullok"}
+          ${optionalString config.krb5.enable
+''auth [default=ignore success=1 service_err=reset] 
${pam_krb5}/lib/security/pam_krb5.so use_first_pass
+auth [default=die success=done] ${pam_ccreds}/lib/security/pam_ccreds.so 
action=validate use_first_pass
+auth sufficient ${pam_ccreds}/lib/security/pam_ccreds.so action=store 
use_first_pass
+          ''}
           auth required   pam_deny.so
 
           # Password management.
           ${optionalString config.users.ldap.enable
               "password sufficient ${pam_ldap}/lib/security/pam_ldap.so"}
+          ${optionalString config.krb5.enable
+              "password sufficient ${pam_krb5}/lib/security/pam_krb5.so 
use_first_pass"}
           password requisite pam_unix.so nullok sha512
           ${optionalString config.services.samba.syncPasswordsByPam
               "password optional ${pkgs.samba}/lib/security/pam_smbpass.so 
nullok use_authtok try_first_pass"}
@@ -86,6 +95,8 @@ let
           # Session management.
           ${optionalString config.users.ldap.enable
               "session optional ${pam_ldap}/lib/security/pam_ldap.so"}
+          ${optionalString config.krb5.enable
+              "session optional ${pam_krb5}/lib/security/pam_krb5.so"}
           session required pam_unix.so
           ${optionalString ownDevices
               "session optional 
${pkgs.consolekit}/lib/security/pam_ck_connector.so"}
@@ -184,7 +195,8 @@ in
     environment.systemPackages =
       # Include the PAM modules in the system path mostly for the manpages.
       [ pkgs.pam ]
-      ++ optional config.users.ldap.enable pam_ldap;
+      ++ optional config.users.ldap.enable pam_ldap
+      ++ optional config.krb5.enable [pam_krb5 pam_ccreds];
 
     environment.etc =
       map makePAMService config.security.pam.services
-- 
1.7.1

>From ac213067bf187900eef1dfded3deca940f0ff180 Mon Sep 17 00:00:00 2001
From: David Guibert <[email protected]>
Date: Sat, 20 Feb 2010 14:48:06 +0100
Subject: [PATCH 1/4] heimdal: add sqlite and exe from libexec to sbin

---
 pkgs/development/libraries/kerberos/heimdal.nix |   17 +++++++++++++----
 pkgs/top-level/all-packages.nix                 |    2 +-
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/pkgs/development/libraries/kerberos/heimdal.nix 
b/pkgs/development/libraries/kerberos/heimdal.nix
index 6cdd101..57f63ae 100644
--- a/pkgs/development/libraries/kerberos/heimdal.nix
+++ b/pkgs/development/libraries/kerberos/heimdal.nix
@@ -1,4 +1,4 @@
-{stdenv, fetchurl, openldap, readline, db4, openssl, cyrus_sasl} :
+{stdenv, fetchurl, openldap, readline, db4, openssl, cyrus_sasl, sqlite} :
 
 stdenv.mkDerivation rec {
   name = "heimdal-1.3.2";
@@ -12,7 +12,16 @@ stdenv.mkDerivation rec {
   };
 
   ## ugly, X should be made an option
-  configureFlags = "--with-openldap=${openldap} --without-x";
-  
-  propagatedBuildInputs = [ readline db4 openssl openldap cyrus_sasl ];
+  configureFlags = [
+       "--with-openldap=${openldap}"
+       "--with-sqlite3=${sqlite}"
+       "--without-x"
+  ];
+  # dont succeed with --libexec=$out/sbin, so
+  postInstall = ''
+       mv $out/libexec/* $out/sbin/
+       rmdir $out/libexec
+  '';
+
+  propagatedBuildInputs = [ readline db4 openssl openldap cyrus_sasl sqlite];
 }
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 2c3c903..f9ea957 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -4242,7 +4242,7 @@ let
   kerberos = heimdal;
 
   heimdal = import ../development/libraries/kerberos/heimdal.nix {
-    inherit fetchurl stdenv readline db4 openssl openldap cyrus_sasl;
+    inherit fetchurl stdenv readline db4 openssl openldap cyrus_sasl sqlite ;
   };
 
   hsqldb = import ../development/libraries/java/hsqldb {
-- 
1.7.1

>From 78a7466a0c3afc62322c89e44bc8d7aa739e65e8 Mon Sep 17 00:00:00 2001
From: David Guibert <[email protected]>
Date: Wed, 31 Mar 2010 22:35:56 +0200
Subject: [PATCH 2/4] pam_krb5: added version 2.3.11-1.

---
 pkgs/os-specific/linux/pam_krb5/default.nix |   19 +++++++++++++++++++
 pkgs/top-level/all-packages.nix             |    4 ++++
 2 files changed, 23 insertions(+), 0 deletions(-)
 create mode 100644 pkgs/os-specific/linux/pam_krb5/default.nix

diff --git a/pkgs/os-specific/linux/pam_krb5/default.nix 
b/pkgs/os-specific/linux/pam_krb5/default.nix
new file mode 100644
index 0000000..62f9b5c
--- /dev/null
+++ b/pkgs/os-specific/linux/pam_krb5/default.nix
@@ -0,0 +1,19 @@
+{stdenv, fetchurl, pam, kerberos}:
+
+stdenv.mkDerivation {
+  name = "pam_krb5-2.3.11-1";
+
+  src = fetchurl {
+    url = 
https://fedorahosted.org/releases/p/a/pam_krb5/pam_krb5-2.3.11-1.tar.gz;
+    sha256 = "1x6wgjzkfkx0h9a7wdgx0jwrdm15npbs79i510lk1n3fyx9lk4mq";
+#    url = http://archives.eyrie.org/software/kerberos/pam-krb5-4.2.tar.gz;
+#    sha256 = "0a0zyd4ddln8yf827qxbfqi1pryxnj0fykfz8lx6nxn2f9pqj1gv";
+  };
+
+  buildInputs = [pam kerberos];
+  meta = {
+#    homepage = "http://www.eyrie.org/~eagle/software/pam-krb5";;
+    homepage = "https://fedorahosted.org/pam_krb5/";;
+    description = "The pam_krb5 module allows PAM-aware applications to 
authenticate users by performing an AS exchange with a Kerberos KDC. It can 
optionally convert Kerberos 5 credentials to Kerberos IV credentials and/or use 
them to set up AFS tokens for a user's session.";
+  };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index f9ea957..bd97511 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -6718,6 +6718,10 @@ let
     inherit stdenv fetchurl pam;
   };
 
+  pam_krb5 = import ../os-specific/linux/pam_krb5 {
+    inherit stdenv fetchurl pam kerberos;
+  };
+
   pam_ldap = import ../os-specific/linux/pam_ldap {
     inherit stdenv fetchurl pam openldap;
   };
-- 
1.7.1

>From 444113c1277213e73cb44815fc77fc615f875268 Mon Sep 17 00:00:00 2001
From: David Guibert <[email protected]>
Date: Thu, 1 Apr 2010 09:04:50 +0200
Subject: [PATCH 3/4] pam_ccreds: to locally authenticate using an enterprise 
identity when the network is unavailable.

---
 pkgs/os-specific/linux/pam_ccreds/default.nix |   19 +++++++++++++++++++
 pkgs/top-level/all-packages.nix               |    5 +++++
 2 files changed, 24 insertions(+), 0 deletions(-)
 create mode 100644 pkgs/os-specific/linux/pam_ccreds/default.nix

diff --git a/pkgs/os-specific/linux/pam_ccreds/default.nix 
b/pkgs/os-specific/linux/pam_ccreds/default.nix
new file mode 100644
index 0000000..4d48c86
--- /dev/null
+++ b/pkgs/os-specific/linux/pam_ccreds/default.nix
@@ -0,0 +1,19 @@
+{stdenv, fetchurl, pam, openssl, db}:
+
+stdenv.mkDerivation {
+  name = "pam_ccreds-10";
+
+  src = fetchurl {
+    url = "http://www.padl.com/download/pam_ccreds.tgz";;
+    sha256 = "1h7zyg1b1h69civyvrj95w22dg0y7lgw3hq4gqkdcg35w1y76fhz";
+  };
+  patchPhase = ''
+    sed 's/-o root -g root//' -i Makefile.in
+  '';
+
+  buildInputs = [pam openssl db];
+  meta = {
+    homepage = "http://www.padl.com/OSS/pam_ccreds.html";;
+    description = "The pam_ccreds module provides the means for Linux 
workstations to locally authenticate using an enterprise identity when the 
network is unavailable.";
+  };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index bd97511..b304742 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -6708,6 +6708,11 @@ let
 
   # pam_bioapi ( see 
http://www.thinkwiki.org/wiki/How_to_enable_the_fingerprint_reader )
 
+  pam_ccreds = import ../os-specific/linux/pam_ccreds {
+    inherit stdenv fetchurl pam openssl;
+    db = db4;
+  };
+
   pam_console = import ../os-specific/linux/pam_console {
     inherit stdenv fetchurl pam autoconf automake pkgconfig bison glib;
     libtool = libtool_1_5;
-- 
1.7.1

_______________________________________________
nix-dev mailing list
[email protected]
https://mail.cs.uu.nl/mailman/listinfo/nix-dev

Reply via email to