[Nix-dev] [PoC] Automatic UIDs and keys owned by non-root users
Игорь Пашев
pashev.igor at gmail.com
Fri Dec 18 21:17:41 CET 2015
Sorry ¯\_(ツ)_/¯
hex = lib.toLower (builtins.substring 0 7 (builtins.hashString
"sha1" name));
- digits = lib.imap (i: d: {m = (i - 1)*16; d = d;})
(lib.stringToCharacters hex);
+ pow = b: n: lib.foldl builtins.mul 1 (builtins.genList (_: b) n);
+ digits = lib.imap (i: d: {m = pow 16 (i - 1); d = d;})
(lib.stringToCharacters hex);
2015-11-29 19:20 GMT+03:00 Игорь Пашев <pashev.igor at gmail.com>:
> $ id mariadb
> uid=1000003264(mariadb) gid=1000003264(mariadb)
> groups=96(keys),1000003264(mariadb)
>
> ...
> config = mkIf cfg.enable {
> autoUsers = [ cfg.user ];
> keyrings.${cfg.user} = [ cfg.s3cfg ];
> ...
>
>
> keyrings.nix: ----------------
> { config, lib, ... }:
>
> with lib;
> with lib.types;
> with builtins;
>
> let
> allusers = config.users.users;
> read = key:
> if config.production
> then (readFile (<secrets> + "/${key}"))
> else "dummy";
>
> in {
> options = {
> keyrings = mkOption {
> type = attrsOf (listOf path);
> description = "Binds keys to a user";
> default = {};
> example = { backup = [ "s3cmd.cfg" ]; };
> };
> };
>
> config = {
> users.users = genAttrs (attrNames config.keyrings) (
> name: optionalAttrs (name != "root") { extraGroups = [ "keys" ]; }
> );
>
> deployment.keys = foldl (a: b: a//b) {} (
> mapAttrsToList (name: keys:
> genAttrs (map baseNameOf keys)
> (key: { text = read key;
> user = toString allusers.${name}.uid;
> })
> ) config.keyrings
> );
> };
> }
>
>
> autoUsers.nix: ---------------
> { config, pkgs, lib, ... }:
>
> let
> names = config.autoUsers;
> uid = name: let
> dec = {
> "0" = 0; "1" = 1; "2" = 2; "3" = 3;
> "4" = 4; "5" = 5; "6" = 6; "7" = 7;
> "8" = 8; "9" = 9; "a" = 10; "b" = 11;
> "c" = 12; "d" = 13; "e" = 14; "f" = 15;
> };
> base = 1000000000; # 2^31 > base + 16^7, 2^31 for JSON int
> hex = lib.toLower (builtins.substring 0 7 (builtins.hashString
> "sha1" name));
> digits = lib.imap (i: d: {m = (i - 1)*16; d = d;})
> (lib.stringToCharacters hex);
> f = a: {m, d}: a + m * dec.${d};
>
> in lib.foldl f base digits;
>
> in {
> options = {
> autoUsers = lib.mkOption {
> type = lib.types.listOf lib.types.str;
> description = "List of system users with automatic UID and group";
> default = [];
> };
> };
>
> config = {
> users.extraGroups = lib.genAttrs names (name: { gid = uid name; });
> users.extraUsers = lib.genAttrs names
> (name: {
> isSystemUser = true;
> uid = uid name;
> group = name;
> });
> };
> }
More information about the nix-dev
mailing list