6059
Comment: immediate tasks / basically dealt with mail
|
18904
randomly stumbled upon a dyndns protocol frontend
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
I am Clinton Ebadi. I am the reluctant President of the coop (someone has to do it), and the current lead sysadmin / DomTool maintainer / lo-fi AdamChlipala replacement. | I am Clinton Ebadi. I am the Treasurer of the coop (someone has to do it), and the current lead sysadmin / DomTool maintainer / lo-fi AdamChlipala replacement. <<TableOfContents>> |
Line 11: | Line 13: |
* January 2013: New website online, navajos and bog both up with new members using them * February 2013->December 2013: Big push for new members. New website should make us seem more alive, we've finally fixed about 3/4 of the "temporary" hacks from when we first moved to Peer1, etc. mire is gone (less work: we just have to get people off of it), but also work toward getting rid of deleuze. Web services first (low hanging fruit), even if it means punting on fully converting to domtool managed sites (at least packaged and documented). AFAICT other than those we're just left with: * DomTool dispatcher * Master DNS * Exim * IMAP (might have to patch courier-authdaemon) * A few straggling openafs volumes (+ AFSDB records?) * Backups * MailMan * The portal * March 2013: Catch the sales on the last generation Dell 2U/2-socket machines and create a clean counterpart to fritz. * Minimal KVM host setup for base OS. We might run the KDC and OpenAFS on the bare metal, not entirely certain. * Create new wheezy based VMs, duplicating (and turning into master) services hosted in VMs on fritz * For the first time, this is realistic: all of those months packaging our configuration pay off by sparing future-me from herculean efforts. And SteveKillen, BtTempleton, and I are probably available for a road trip to Peer1. * March 2013->July 2013: Transition remaining services off of deleuze onto KernelVirtualMachine``s on new kvm host * April 2013: Election and hopefully 120 members. Mire has been turned off for at least a month at this point. * Winter 2013: Assuming 150+ members, perhaps more bandwidth is in order. Deleuze should be safe to turn off by now at the latest. * Spring 2014: Ponies for everyone. * IPv6, mediagoblin, diaspora, gitorious, xmpp works again (and ability to use vanity domains), ... |
* Summer/Fall 2020: Debian buster across the board, OpenAFS 1.8.6, [[https://compliance.conversations.im/|full compliance with modern XMPP requirements]], maybe [[/JitsiMeet]] |
Line 34: | Line 18: |
* unknownlamer (AOL Instant Messenger) * <<MailTo(clinton at hcoop dot net)>> (Jabber) |
* <<MailTo(clinton at hcoop dot net)>> (XMPP) |
Line 37: | Line 20: |
* +1 443 538 8058 (Phone, SMS preffered) | * +1 443 538 8058 (Phone, SMS preffered as I will ignore your call if I don't have your number already and check voicemail approximately once per century) |
Line 41: | Line 24: |
* http://unknownlamer.org '''Personal Homepage''' | * https://unknownlamer.org '''Personal Homepage''' * [[https://journal.unknownlamer.org|My Journal]] is a bit less dusty * http://demoncat.org |
Line 44: | Line 29: |
= Immediate Tasks = * Reattempt contacting members who have ignored the roll-call * Each board member gets 20, mail Non-HCoop Email, application email if it is available * Get website online * Planet * Move dynamic stuff back into `/dyn` * Networked domtool-tail * `fwtool regen` with no host (= all hosts) * Possible donations for new server * Board meeting * Backups (blocked by lack of hardware) * Spec out new server |
= Tasks = == Underway == * (./) buster upgrade on shell and webserver this weekend * (./) buster upgrade mail/xmpp server * upgrade mysql to 5.7 on gibran * change default `PhpVersion` to 7.4 * upgrade openafs servers to 1.8 * Procedure for [[https://docs.openafs.org/QuickStartUnix/HDRWQ50.html|creating KeyFileExt]] to replace rxkad * upgrade outpost to buster * test bind first on ServerBusted * upgrade lovelace to buster after making sure things are stable with outpost upgrades * start dealing with increasing the krbtgt strength (just adding stronger ciphers and removing the weakest ciphers initially + re-generating high value service principals) * upgrade gibran to buster * reimplement multiple postgres instance support, upgrade to latest (on port 5432 again finally...) * Enter old bills into the portal and reconcile everything so we can implement FinancialReservePolicy * Time permitting, squeeze in setting up [[/JitsiMeet]] if tests prove it's feasible for us to host == Medium term == As of this writing, this means "hopefully before the end of 2020" * Grant members `all on $db.*` in mysql now that we have backups so if they manage to drop their database it's not fatal anymore. Will make default mysql experience much saner. * Opt all members and vmail accounts into spam checking, automatically move spam to ~Maildir/.Junk, (pending discussion) auto delete mail in Junk (see TODO DaemonAdmin/SpamAssassin) * Letsencrypt integration into domtool == Longer Term == Probably during 2021 * Managing data when members depart better * Useful, member accessible backups === Centralize apache logging === domtool-tail is broken, and supporting it is challenging in a multi-server environment. Instead, we could like just use syslog to write logs to either nfs or afs in real time. * DomTool would generate a syslog-ng config snippet to monitor each user log file and write to the final destination AFS: * Write directly to `~/.logs/apache/SERVER/DOMAIN/...` * Downside: Unless we want to run a bunch of syslog instances, there would have to be a shared syslog principal that could write to all member log directories NFS: * Syslog would just write logs to another directory on the server, and set permissions to the user the log really belongs to (can't do this directly with the apache logs as anyone who can write to the log can do bad things, in theory, so directly mounting `/var/log/apache2` is impossible). * Exported directories from each host would be mounted on the member login server * Regular UNIX permissions would be used to control access, since we control the user database for both machines and know UIDs will match * Logs would be regularly rsynced to afs storage (using `USER.daemon` credentials) as is done now for longer term storage In either case, might be a good idea to move logs to a dedicated volume? And maybe introduce `USER.log` principles ... is there any reason we would want to allow `USER.daemon` access to the log directory by default? Only case I could see would be members using daemon roles to automatically process logs, in which case presumably they would be able to handle granting the required permissions manually. |
Line 60: | Line 86: |
== Improve SSL Experience == * We are not managing certificates well * we don't check and warn members when their certs are going to expire * requesting certs via the filesystem is clunky for most users, we should support upload via the portal instead * Need to add letsencrypt support === Domtool === Replace `use_cert` `cert` function that just takes the final name instead of the full pathname, providing the full pathname is kind of clunky. {{{ extern type your_cert; extern val cert : your_cert -> ssl (* SSL = cert "mydomain.pem"; *) }}} We also need to support letencrypt, perhaps like so: {{{ extern type your_letsencrypt_cert; extern val letsencrypt : your_letsencrypt_cert -> ssl (* SSL = letsencrypt "my.domain"; *) }}} Which would find the certs in the standard location used by certbot... or we could use symlinks there from our location. === Portal === We should allow submission of certs / keys through the web interface. Can use an insert-only afs dir to securely allow hcoop.daemon to write certs without being able to access them, which would then be installed manually by an admin using `ca-install`. The portal request page should display all certs a user is permitted to use already, their common name, and their expiration date. === Managing Certificates === ''Needs Updating'' Not very fleshed out, also does not consider how we're going to manage letsencrypt certs Since we no longer need to support explicit intermediate certs (everything nowadays accepts the chain in the main certificate file), we can just use domtool's cert permission to track things. A cron should check for things like: * Certs that are not owned by any member in domtool * Permissions to certs that don't exist * Expired or soon to expire certs (should exponentially back off notice until expiration date changes, like quotacheck does for low space), emailing the member as well as admins@ Certificate CN and validity dates should be shown on the portal ssl page; ssl check cron should cache this somewhere the portal can read it. destroy-user needs to nuke certs for leaving members ... we need to overhaul this generally and stash all member data in one location when destroying for later removal / restoration (if they return in the 30 day deletion window). === Managing Member Data Better === Trying to hash out how we can better manage user data when they depart; right now we reply on someone (me...) to go in 30 days after removing a member to remove all of their non-afs data manually, which is prone to error and needs to be managed better if we want to comply with things like GDPR (although I don't think it applies to us directly as a US corporation, it would be ''nice'' to do so since we really don't want to be retaining data longer than needed anyway, and the US will likely have stringent privacy laws aimed at facebook/google that will punish all the same for failing to remove data immediately too...). * Databases (/srv/databases/u/us/user/*) * SSL certs /etc/apache2/ssl/user/$domain * Maybe add username to the path; we are managing these with domtool perms so it's easy enough to find which certs belonged to a member... until we remove all of their permissions when removing their account. * Portal database data * Payment records / archived member app: cannot be deleted, we are legally required to have open books for our members * URL and location database entries: these should definitely be purged after the retention period * Firewall rules * Currently rules are stored in one file, would be easier to manage if we split each member's rules into a separate file * GNU Mailman lists * We don't track who owns which list outside of the list control request in the portal * ejabberd data * mnesia: rosters, PEP, ... we might want to convert our mnesia database to postgres to make removing data associated with departing members simpler * mod_mam -- actual messages, but in SQL (`delete * from archive where username = 'XXX';`): we haven't started storing these as of 2019-05-10, so it would be a good candidate to add to an initial `purge-user` script when setting up. * mod_http_upload files in local storage on the ejabberd server (we expire these every 30 days already) * Incidental data in the roundcube webmail database (address book, preferences) * Including data for any vmail users associated with the member (additional wrinkle there: should we be removing this data as soon as a member deletes a vmail user?) Not personal data, but things we should clear for housekeeping in general: * Apache davlockdb directory We already manage mail and $HOME data fine, both are easy to clear (delete the volumes, done). One aspect of the solution I've been thinking about that would also make it easier for members to export their data in general: we could set up a `backups.$user` volume, and store dumps of data we hold on behalf of the data there: database backups, mailing list archives, an exported dump of their ejabberd roster, maybe even copies of their ssl certs. We also need a registry of data we keep on behalf of members that can't immediately be identified based on their username: at least ssl certs and mailing lists (those might be it though... and certs are already tracked with domtool perms so maybe just adding a "list" perm would be adequate, which could then be used to maybe allow members to perform some list management through a domtool program). And we need to store things like domtool permissions when destroying (might be able to achieve some of this by first freezing members before removing them), so that we can use them later when performing the final purge of data after the retention period ends (important to keep a brief retention period for those "oh right, I have to actually pay dues" moments...). |
|
Line 62: | Line 169: |
* default DirectoryIndex does not include index.shtml, should this be changed? == Terrible Things == Since we are having a roll call soon, we need to deal with these. * phpVersion needs to change |
* default Directory``Index does not include index.shtml, should this be changed? * `vhostDefault` makes configuring the default vhost slightly unpleasant. Extend `host` with `host_default` token and eliminate? == Website == (create Website bugzilla product and move these there) * Convert hcoop.net into domtool config (looks trivial, a few rewrites... except for userdir support?) * On the topic of user dirs: allow members to register a redirect for hcoop.net/~foo?) * Perhaps: Move userdirs to `http://users.hcoop.net/~foo` (302ing from `hcoop.net/~foo`) * (./) Replace facebook links with other "get to know the members" text * Inspire members to join the planet * Make the locations tool usable again (something we can use with Openstreetmap). * Give RobinTempleton access as needed === Wiki === * [[http://moinmo.in/MacroMarket/ChildPages|child pages macro]] for listing the section of the member manual in the sidebar? |
Line 74: | Line 192: |
* SSL improvements (SNI, intermediate certificates, ...) * Networked domtool-tail * FastCGI * Seems like the most straightforward of the fancy CGI to persistent server replacement to gets working, and has wide support. MoinMoin can use it... and it's a lot less tricky for members to get working than proxied servers on another host. * Ideally, support wsgi and whatnot later, assuming they can do suexec * `default CSymbol = Value` for binding default environment variable settings * Expands the scope of extensions that can be written in pure DomTool, slight flexibility gains * Improve `fwtool` as needs become clearer * `fwtool regen` without node to regen all nodes, `fwtool verify` and possibly something akin to `visudo` * Programmitic interface to adding/removing/etc rules? * At least need a way to kill rules when destroying the user, ideally just disabling them? (existing code ignores users who do not exist, so it sort of works to ignore it, but cleanliness of the rules file will become a problem). * "Proper" parser. Read rules into typed structure using the magic of SML, and work on that form (more natural, type safe, etc.) * groups or similar for common ports * We need a way to grant users who just want general net access a reasonably unrestrictive firewall, without needlessly opening things for members who don't use our shell services extensively. Since we can't restrict socket permissions generally, defining groups that provide common firewall rules seems like an ok solution. |
* Improve `fwtool` as needs become clearer (FirewallTool) === restricted modules for apache === Inspiration: hcoop.net's vhost is non generated by domtool, and only because it enabled mod_userdir Idea: have a set of restricted modules that can only be used by superusers. Easiest to just have another ad-hoc list setting in config for domtool. ACL example: `hcoop priv www`, `www` priv overloaded to also allow use of restricted module. Problems: no way currently to restrict access to actions or lib files. Deficiences: `priv www` is a blunt instrument. `priv` system in general is mediocre. It might be nice to be able to do something like `hcoop priv www apache-module/userdir mail/hopper.hcoop.net` (i.e. access to all www nodes, access to the userdir module only, access to hopper). Keys gain some hierarchy polluting the purity of the triples db, but it is already a bit polluted... is there any difference between adding hierarchy to priv keys and the existing implicit hierarchies in domains and paths? Solution: might be overkill just for mod_userdir, if it looks like minimal additional code is required perhaps implement hierarchical privs (extending www and mail privs to support limiting to particular admin hosts) and restricted apache modules. === Pattern Matching and New Types === A vague idea that may prove to be unworkable. I think at least implementing list matching in domtool would be quite useful. Abstraction syntax would be need to be improved to support multiple clauses. `case` would also be needed to make it useful. Syntax would be easy enough to add except for having to deal with runtime non-exhaustive match exceptions (perhaps requiring exhaustive matches and living with the limitation). Ambitious, probably time consuming, might require adding tail call optimization to the interpreter. Example: {{{ (* A map operator *) val map = \action -> \list -> case list of head::tail => begin action head; map action tail; end | [] => Skip; (* Alias a list of email addresses to *) val multiAlias = \sources -> \target -> map (\source -> emailAlias source target) sources; }}} I probably lack the skill/willpower in the short term... alternative idea, just implement a loop primitive in SML and magic the types away by making it a primitive construct (defining its type on DomTool/LanguageReference). Maybe implement polymorphic actions if adding then is secretly easy: {{{ extern val map : (('a -> 'b) -> ['a]) -> [^Root]; (* Alias a list of email addresses to *) val multiAlias = \sources -> \target -> map (\source -> emailAlias source target) sources; }}} Most of the gain, none of the pain. New types: even more ambitious. Supporting at least tuples or named records, and perhaps a construct for querying the domtool acl database. Idea would be to use it for something like the firewall, where only primitive "generate one firewall rule" constructs would be needed, and then user firewalls could be constructed by querying the ports available to each user and matching/looping. One pattern that has recurred in domtool is that of a special purpose client + server commands that operates on a simple database. E.g. spamassassin prefs, vmail users, firewall rules, and the domtool acl database. It would be useful to have a generalized serialize/unserialize sets of sml records library, perhaps with a generalized/queryable tuples database built on top of the primitive raw-records database. Even better would be to allow databases to be exposed to domtool, and simple queries performed on them. Maybe. {{{ val writeRecord' : [('record -> }}} === ip / ipv4 / ipv6 === There are a few places (mostly apache) where it would be great to be able to interchange ip and ipv6 addresses. But there's no way to subtype in domtool (except for refining base int and string). It's been shoehorned in for now (always requiring a node to have an ipv6 address), but this can be a bit awkward (e.g. `webAtIp` requires that an ipv4 and ipv6 address be provided). --(Also might make sense to be able to pass an array of IPs in a few spots instead of just fixing it at one ipv4 and one ipv6 address per `WebPlace`.)-- you can just pass more than one WebPlace already. = Things to Look At = == Dynamic DNS == a couple of members have been requesting a dynamic dns solution for a while now, some possible solutions: * https://github.com/SFTtech/sftdyn == Easier App Install == We should probably figure out how we can support docker containers because they are popular and there is no stopping them (plus maybe they are a ''bit'' convenient). [[https://podman.io/|Podman]] in theory works on Debian Buster and might even run in afs (I did one test and it seemed to)... but mainly it lets users run containers as themselves without need a daemon running as root and zero security. * https://docs.sandstorm.io/en/latest/administering/hosting-provider/ "Sandstorm is an open source platform for self-hosting web apps" that claims to support multiple users on the same server * https://cockpit-project.org/blog/cockpit-206.html web gui for podman that integrates with kerberos and claims to allow unprivileged users to manage containers under their own account |
Line 92: | Line 271: |
* We need a private wiki of some sort for filing sensitive information like welcome emails for services and various credentials... is it safe enough to do that using the public moin and acls? I'm not sure sure... == Roll Call == https://members.hcoop.net/portal/roll?view=10 After an initial burst of acknowledgement, acknowledgements came to a stand still after only four days. We need to contact everyone by alternate means. Write SQL to extract initial member app email and non-hcoop email so that we can either automatically or manually re-contact everyone. * Can we use paypal/wallet addresses? It might be against the TOS for those services to email members like that, but if it's not... paying us is basically the only contact we have with most members so I bet they'd be the most reliable. * WebUser.paypal, WebUser.checkout, MemberApp.email, Contact.v (what ContactKind for email?) |
* Possible policy change: pro-rate the first month of dues for new members. It seems a bit unfair to make folks pay an entire month of dues, especially if they join near the end of the month. * Board did approve this, but was never implemented :-\ * Do we need a private wiki of some sort for filing sensitive information like welcome emails for services and various credentials... is it safe enough to do that using the public moin and acls? I'm not sure sure... = etc = Barely formed sentences. == tt-rss at hcoop == Our postgresql does not use passwords. The installer needs a single tweak to remove the required attribute of the database password to install. == Fastcgi Problems with openafs == ''Old Content'': This section is from before fastcgi was implemented. Leaving so I might remember one day to try the idea of adding an suexec hook to apache. The mod_fcgid spawner runs in its own process pool and therefore without tokens or the ability to acquire tokens for processes it launches. Thus, all fcgi processes must be wrapped to avoid surprising behavior. The `FcgidWrapper` directive is not very expressive: the "wrapper" is the fastcgi application that is launched and then passed any files matching the extension using `SCRIPT_NAME`. A wrapper wrapping script is needed to grab tokens before launching the actual wrapper, and just using `{Add,Set}Handler fcgid-script` won't work as expected (users could of course arrange for programs run that way to grab tokens manually). mod_wsgid and mod_cgid have identical problems. Inspecting the apache source code makes it appear that it would be possible to fix the situation generally by adding a pre/post suexec hook. The process managers for mod_cgid/mod_fcgid/mod_wsgid are forked from the primordial apache process which I understand has all modules loaded. Modules like mod_auth_kerb and mod_waklog could then inject tickets/tokens/etc. into the environment from which external processes were spawned using the suexec hooks. |
I am Clinton Ebadi. I am the Treasurer of the coop (someone has to do it), and the current lead sysadmin / DomTool maintainer / lo-fi AdamChlipala replacement.
Contents
1. Board Statements
See /BoardStatements
2. General Coop Goals
Unstructured musing on when/what I think the coop ought to be.
Summer/Fall 2020: Debian buster across the board, OpenAFS 1.8.6, full compliance with modern XMPP requirements, maybe /JitsiMeet
3. Contact
<clinton at unknownlamer dot org> (Email)
<clinton at hcoop dot net> (XMPP)
unknown_lamer on freenode (IRC) in #hcoop
- +1 443 538 8058 (Phone, SMS preffered as I will ignore your call if I don't have your number already and check voicemail approximately once per century)
4. Websites
https://unknownlamer.org Personal Homepage
My Journal is a bit less dusty
5. Tasks
5.1. Underway
buster upgrade on shell and webserver this weekend
buster upgrade mail/xmpp server
- upgrade mysql to 5.7 on gibran
change default PhpVersion to 7.4
- upgrade openafs servers to 1.8
Procedure for creating KeyFileExt to replace rxkad
- upgrade outpost to buster
test bind first on ServerBusted
- upgrade lovelace to buster after making sure things are stable with outpost upgrades
- start dealing with increasing the krbtgt strength (just adding stronger ciphers and removing the weakest ciphers initially + re-generating high value service principals)
- upgrade gibran to buster
- reimplement multiple postgres instance support, upgrade to latest (on port 5432 again finally...)
Enter old bills into the portal and reconcile everything so we can implement FinancialReservePolicy
Time permitting, squeeze in setting up /JitsiMeet if tests prove it's feasible for us to host
5.2. Medium term
As of this writing, this means "hopefully before the end of 2020"
Grant members all on $db.* in mysql now that we have backups so if they manage to drop their database it's not fatal anymore. Will make default mysql experience much saner.
Opt all members and vmail accounts into spam checking, automatically move spam to ~Maildir/.Junk, (pending discussion) auto delete mail in Junk (see TODO DaemonAdmin/SpamAssassin)
- Letsencrypt integration into domtool
5.3. Longer Term
Probably during 2021
- Managing data when members depart better
- Useful, member accessible backups
5.3.1. Centralize apache logging
domtool-tail is broken, and supporting it is challenging in a multi-server environment. Instead, we could like just use syslog to write logs to either nfs or afs in real time.
DomTool would generate a syslog-ng config snippet to monitor each user log file and write to the final destination
AFS:
Write directly to ~/.logs/apache/SERVER/DOMAIN/...
- Downside: Unless we want to run a bunch of syslog instances, there would have to be a shared syslog principal that could write to all member log directories
NFS:
Syslog would just write logs to another directory on the server, and set permissions to the user the log really belongs to (can't do this directly with the apache logs as anyone who can write to the log can do bad things, in theory, so directly mounting /var/log/apache2 is impossible).
- Exported directories from each host would be mounted on the member login server
- Regular UNIX permissions would be used to control access, since we control the user database for both machines and know UIDs will match
Logs would be regularly rsynced to afs storage (using USER.daemon credentials) as is done now for longer term storage
In either case, might be a good idea to move logs to a dedicated volume? And maybe introduce USER.log principles ... is there any reason we would want to allow USER.daemon access to the log directory by default? Only case I could see would be members using daemon roles to automatically process logs, in which case presumably they would be able to handle granting the required permissions manually.
6. Admin Stuff
6.1. Improve SSL Experience
- We are not managing certificates well
- we don't check and warn members when their certs are going to expire
- requesting certs via the filesystem is clunky for most users, we should support upload via the portal instead
- Need to add letsencrypt support
6.1.1. Domtool
Replace use_cert cert function that just takes the final name instead of the full pathname, providing the full pathname is kind of clunky.
extern type your_cert; extern val cert : your_cert -> ssl (* SSL = cert "mydomain.pem"; *)
We also need to support letencrypt, perhaps like so:
extern type your_letsencrypt_cert; extern val letsencrypt : your_letsencrypt_cert -> ssl (* SSL = letsencrypt "my.domain"; *)
Which would find the certs in the standard location used by certbot... or we could use symlinks there from our location.
6.1.2. Portal
We should allow submission of certs / keys through the web interface. Can use an insert-only afs dir to securely allow hcoop.daemon to write certs without being able to access them, which would then be installed manually by an admin using ca-install.
The portal request page should display all certs a user is permitted to use already, their common name, and their expiration date.
6.1.3. Managing Certificates
Needs Updating Not very fleshed out, also does not consider how we're going to manage letsencrypt certs
Since we no longer need to support explicit intermediate certs (everything nowadays accepts the chain in the main certificate file), we can just use domtool's cert permission to track things.
A cron should check for things like:
- Certs that are not owned by any member in domtool
- Permissions to certs that don't exist
- Expired or soon to expire certs (should exponentially back off notice until expiration date changes, like quotacheck does for low space), emailing the member as well as admins@
Certificate CN and validity dates should be shown on the portal ssl page; ssl check cron should cache this somewhere the portal can read it.
destroy-user needs to nuke certs for leaving members ... we need to overhaul this generally and stash all member data in one location when destroying for later removal / restoration (if they return in the 30 day deletion window).
6.1.4. Managing Member Data Better
Trying to hash out how we can better manage user data when they depart; right now we reply on someone (me...) to go in 30 days after removing a member to remove all of their non-afs data manually, which is prone to error and needs to be managed better if we want to comply with things like GDPR (although I don't think it applies to us directly as a US corporation, it would be nice to do so since we really don't want to be retaining data longer than needed anyway, and the US will likely have stringent privacy laws aimed at facebook/google that will punish all the same for failing to remove data immediately too...).
- Databases (/srv/databases/u/us/user/*)
- SSL certs /etc/apache2/ssl/user/$domain
- Maybe add username to the path; we are managing these with domtool perms so it's easy enough to find which certs belonged to a member... until we remove all of their permissions when removing their account.
- Portal database data
- Payment records / archived member app: cannot be deleted, we are legally required to have open books for our members
- URL and location database entries: these should definitely be purged after the retention period
- Firewall rules
- Currently rules are stored in one file, would be easier to manage if we split each member's rules into a separate file
- GNU Mailman lists
- We don't track who owns which list outside of the list control request in the portal
- ejabberd data
- mnesia: rosters, PEP, ... we might want to convert our mnesia database to postgres to make removing data associated with departing members simpler
mod_mam -- actual messages, but in SQL (delete * from archive where username = 'XXX';): we haven't started storing these as of 2019-05-10, so it would be a good candidate to add to an initial purge-user script when setting up.
- mod_http_upload files in local storage on the ejabberd server (we expire these every 30 days already)
- Incidental data in the roundcube webmail database (address book, preferences)
- Including data for any vmail users associated with the member (additional wrinkle there: should we be removing this data as soon as a member deletes a vmail user?)
Not personal data, but things we should clear for housekeeping in general:
- Apache davlockdb directory
We already manage mail and $HOME data fine, both are easy to clear (delete the volumes, done).
One aspect of the solution I've been thinking about that would also make it easier for members to export their data in general: we could set up a backups.$user volume, and store dumps of data we hold on behalf of the data there: database backups, mailing list archives, an exported dump of their ejabberd roster, maybe even copies of their ssl certs.
We also need a registry of data we keep on behalf of members that can't immediately be identified based on their username: at least ssl certs and mailing lists (those might be it though... and certs are already tracked with domtool perms so maybe just adding a "list" perm would be adequate, which could then be used to maybe allow members to perform some list management through a domtool program). And we need to store things like domtool permissions when destroying (might be able to achieve some of this by first freezing members before removing them), so that we can use them later when performing the final purge of data after the retention period ends (important to keep a brief retention period for those "oh right, I have to actually pay dues" moments...).
6.2. etc.
default DirectoryIndex does not include index.shtml, should this be changed?
vhostDefault makes configuring the default vhost slightly unpleasant. Extend host with host_default token and eliminate?
6.3. Website
(create Website bugzilla product and move these there)
- Convert hcoop.net into domtool config (looks trivial, a few rewrites... except for userdir support?)
- On the topic of user dirs: allow members to register a redirect for hcoop.net/~foo?)
Perhaps: Move userdirs to http://users.hcoop.net/~foo (302ing from hcoop.net/~foo)
Replace facebook links with other "get to know the members" text
- Inspire members to join the planet
- Make the locations tool usable again (something we can use with Openstreetmap).
Give RobinTempleton access as needed
6.3.1. Wiki
child pages macro for listing the section of the member manual in the sidebar?
6.4. domtool plans
- Feature backlog
Improve fwtool as needs become clearer (FirewallTool)
6.4.1. restricted modules for apache
Inspiration: hcoop.net's vhost is non generated by domtool, and only because it enabled mod_userdir
Idea: have a set of restricted modules that can only be used by superusers. Easiest to just have another ad-hoc list setting in config for domtool. ACL example: hcoop priv www, www priv overloaded to also allow use of restricted module.
Problems: no way currently to restrict access to actions or lib files.
Deficiences: priv www is a blunt instrument. priv system in general is mediocre. It might be nice to be able to do something like hcoop priv www apache-module/userdir mail/hopper.hcoop.net (i.e. access to all www nodes, access to the userdir module only, access to hopper). Keys gain some hierarchy polluting the purity of the triples db, but it is already a bit polluted... is there any difference between adding hierarchy to priv keys and the existing implicit hierarchies in domains and paths?
Solution: might be overkill just for mod_userdir, if it looks like minimal additional code is required perhaps implement hierarchical privs (extending www and mail privs to support limiting to particular admin hosts) and restricted apache modules.
6.4.2. Pattern Matching and New Types
A vague idea that may prove to be unworkable. I think at least implementing list matching in domtool would be quite useful. Abstraction syntax would be need to be improved to support multiple clauses. case would also be needed to make it useful. Syntax would be easy enough to add except for having to deal with runtime non-exhaustive match exceptions (perhaps requiring exhaustive matches and living with the limitation). Ambitious, probably time consuming, might require adding tail call optimization to the interpreter. Example:
(* A map operator *) val map = \action -> \list -> case list of head::tail => begin action head; map action tail; end | [] => Skip; (* Alias a list of email addresses to *) val multiAlias = \sources -> \target -> map (\source -> emailAlias source target) sources;
I probably lack the skill/willpower in the short term... alternative idea, just implement a loop primitive in SML and magic the types away by making it a primitive construct (defining its type on DomTool/LanguageReference). Maybe implement polymorphic actions if adding then is secretly easy:
extern val map : (('a -> 'b) -> ['a]) -> [^Root]; (* Alias a list of email addresses to *) val multiAlias = \sources -> \target -> map (\source -> emailAlias source target) sources;
Most of the gain, none of the pain.
New types: even more ambitious. Supporting at least tuples or named records, and perhaps a construct for querying the domtool acl database. Idea would be to use it for something like the firewall, where only primitive "generate one firewall rule" constructs would be needed, and then user firewalls could be constructed by querying the ports available to each user and matching/looping.
One pattern that has recurred in domtool is that of a special purpose client + server commands that operates on a simple database. E.g. spamassassin prefs, vmail users, firewall rules, and the domtool acl database. It would be useful to have a generalized serialize/unserialize sets of sml records library, perhaps with a generalized/queryable tuples database built on top of the primitive raw-records database. Even better would be to allow databases to be exposed to domtool, and simple queries performed on them. Maybe.
val writeRecord' : [('record ->
6.4.3. ip / ipv4 / ipv6
There are a few places (mostly apache) where it would be great to be able to interchange ip and ipv6 addresses. But there's no way to subtype in domtool (except for refining base int and string).
It's been shoehorned in for now (always requiring a node to have an ipv6 address), but this can be a bit awkward (e.g. webAtIp requires that an ipv4 and ipv6 address be provided).
Also might make sense to be able to pass an array of IPs in a few spots instead of just fixing it at one ipv4 and one ipv6 address per WebPlace. you can just pass more than one WebPlace already.
7. Things to Look At
7.1. Dynamic DNS
a couple of members have been requesting a dynamic dns solution for a while now, some possible solutions:
7.2. Easier App Install
We should probably figure out how we can support docker containers because they are popular and there is no stopping them (plus maybe they are a bit convenient). Podman in theory works on Debian Buster and might even run in afs (I did one test and it seemed to)... but mainly it lets users run containers as themselves without need a daemon running as root and zero security.
https://docs.sandstorm.io/en/latest/administering/hosting-provider/ "Sandstorm is an open source platform for self-hosting web apps" that claims to support multiple users on the same server
https://cockpit-project.org/blog/cockpit-206.html web gui for podman that integrates with kerberos and claims to allow unprivileged users to manage containers under their own account
8. Board Stuff
- What address should we be using for the "owner" of hcoop services? It's a mix of the current treasurer, registered agent, and data center right now... is the registered agent correct? Do we need to get a PO Box or something?
- Possible policy change: pro-rate the first month of dues for new members. It seems a bit unfair to make folks pay an entire month of dues, especially if they join near the end of the month.
- Board did approve this, but was never implemented :-\
- Do we need a private wiki of some sort for filing sensitive information like welcome emails for services and various credentials... is it safe enough to do that using the public moin and acls? I'm not sure sure...
9. etc
Barely formed sentences.
9.1. tt-rss at hcoop
Our postgresql does not use passwords. The installer needs a single tweak to remove the required attribute of the database password to install.
9.2. Fastcgi Problems with openafs
Old Content: This section is from before fastcgi was implemented. Leaving so I might remember one day to try the idea of adding an suexec hook to apache.
The mod_fcgid spawner runs in its own process pool and therefore without tokens or the ability to acquire tokens for processes it launches. Thus, all fcgi processes must be wrapped to avoid surprising behavior. The FcgidWrapper directive is not very expressive: the "wrapper" is the fastcgi application that is launched and then passed any files matching the extension using SCRIPT_NAME. A wrapper wrapping script is needed to grab tokens before launching the actual wrapper, and just using {Add,Set}Handler fcgid-script won't work as expected (users could of course arrange for programs run that way to grab tokens manually).
mod_wsgid and mod_cgid have identical problems. Inspecting the apache source code makes it appear that it would be possible to fix the situation generally by adding a pre/post suexec hook. The process managers for mod_cgid/mod_fcgid/mod_wsgid are forked from the primordial apache process which I understand has all modules loaded. Modules like mod_auth_kerb and mod_waklog could then inject tickets/tokens/etc. into the environment from which external processes were spawned using the suexec hooks.