Jump to content

FeministWiki:Technical documentation: Difference between revisions

(26 intermediate revisions by the same user not shown)
Line 6: Line 6:


{| class="wikitable"
{| class="wikitable"
!IP            !! FQDN                        !! Host          !! Purpose
!IP            !! FQDN                        !! Host          !! Purpose                 !! Ports
|-
|-
|85.214.101.34 ||            feministwiki.org ||              || Wiki
|85.214.101.34 ||            feministwiki.org ||              || Wiki                   || 80, 443
|-
|-
|85.214.101.34 ||        www.feministwiki.org || www          || Wiki
|85.214.101.34 ||        www.feministwiki.org || www          || Wiki                   || 80, 443
|-
|-
|85.214.101.34 ||      ldap.feministwiki.org || ldap          || LDAP
|85.214.101.34 ||      ldap.feministwiki.org || ldap          || LDAP                   || -
|-
|-
|85.214.101.34 ||       blog.feministwiki.org || blog          || Shared blog
|85.214.101.34 ||     blogs.feministwiki.org || blogs        || Blogging                || 80, 443
|-
|-
|85.214.101.34 ||      blogs.feministwiki.org || blogs        || Personalized blogs
|85.214.101.34 ||      chat.feministwiki.org || chat          || Web-client for XMPP    || 80, 443
|-
|-
|85.214.101.34 ||       chat.feministwiki.org || chat          || Web-client for XMPP
|85.214.101.34 ||     forum.feministwiki.org || forum        || BBS Forum              || 80, 443
|-
|-
|85.214.101.34 ||     forum.feministwiki.org || forum        || BBS Forum
|85.214.101.34 ||       mail.feministwiki.org || mail          || Web-client for Mail    || 80, 443
|-
|-
|85.214.101.34 ||       mail.feministwiki.org || mail          || Web-client for Mail
|85.214.101.34 ||     files.feministwiki.org || files        || File storage            || 80, 443
|-
|-
|85.214.101.34 ||     files.feministwiki.org || files        || File storage
|85.214.101.34 ||       imap.feministwiki.org || imap          || IMAP                    || 993
|-
|-
|85.214.101.34 ||      imap.feministwiki.org || imap         || IMAP
|85.214.101.34 ||      pop3.feministwiki.org || pop3         || POP3                    || 995
|-
|-
|85.214.101.34 ||      pop3.feministwiki.org || pop3         || POP3
|85.214.101.34 ||      smtp.feministwiki.org || smtp         || SMTP                    || 25, 465, 587
|-
|-
|85.214.101.34 ||      smtp.feministwiki.org || smtp         || SMTP
|85.214.101.34 ||      xmpp.feministwiki.org || xmpp         || XMPP                    || 5222, 5223, 5269, 5270, 5443, 7777
|-
|-
|85.214.101.34 ||       xmpp.feministwiki.org || xmpp          || XMPP
|85.214.101.34 ||       irc.feministwiki.org || irc          || IRC                    || 6697
|-
|-
|85.214.101.34 ||       irc.feministwiki.org || irc          || IRC
|85.214.101.34 ||   account.feministwiki.org || account      || Account operations      || 80, 443
|-
|85.214.101.34 ||    social.feministwiki.org || social        || GNU social
|-
|85.214.101.34 || add-member.feministwiki.org || add-member    || Add a member
|}
|}


(As you can see, all services are on the same server for now.)
As you can see, all services are on the same server for now. However, it should be kept as an open possibility that the hosts are split across different IPs.  When done so, the <code>ldap</code> host should listen on 636 for LDAPS connections.
 
There are no AAAA entries in the DNS because we only allow IPv4 for incoming connections.  This simplifies security auditing.


== Special DNS entries ==
== Special DNS entries ==
Line 68: Line 66:
|TXT  || _dmarc          || v=DMARC1; p=reject; rua=<nowiki>mailto:admin</nowiki>@feministwiki.org || DMARC
|TXT  || _dmarc          || v=DMARC1; p=reject; rua=<nowiki>mailto:admin</nowiki>@feministwiki.org || DMARC
|}
|}
'''Note:''' There must be a direct A or AAAA record (not a CNAME record) for the domain name specified in the MX record.


For XMPP:
For XMPP:
Line 77: Line 77:
|-
|-
|SRV  || _xmpp-server || _tcp    || @    || xmpp.feministwiki.org || 5269
|SRV  || _xmpp-server || _tcp    || @    || xmpp.feministwiki.org || 5269
|-
|SRV  || _xmpps-client || _tcp    || @    || xmpp.feministwiki.org || 5223
|-
|SRV  || _xmpps-server || _tcp    || @    || xmpp.feministwiki.org || 5270
|}
|}


Line 86: Line 90:
|TXT  || @              || google-site-verification=<key>
|TXT  || @              || google-site-verification=<key>
|}
|}
== Firewall ==
The simple <code>ufw</code> firewall-frontend is used to trivially limit all network I/O to the ports you can see in the host table above, plus port 22 for ssh and scp.
UFW adds IPv6 rules by default, which can be prevented by using more explicit rules.  Consider the following rule:
  ufw allow 12345/tcp  # will allow TCP connections to port 12345 via IPv4 and IPv6
To limit this to IPv4 you can instead use this:
  ufw allow proto tcp to 0.0.0.0/0 port 12345  # will allow TCP connections to port 12345 via IPv4 only
== Fail2ban ==
We use <code>fail2ban</code> to detect brute force attempts on some services.  The git repository for scripts and config contains the relevant Fail2ban configuration under <code>etc/fail2ban</code>.


== SSH access ==
== SSH access ==
Line 115: Line 135:
  cat fullchain.pem privkey.pem > certbundle.pem
  cat fullchain.pem privkey.pem > certbundle.pem


The script <code>/root/bin/letsencrypt-refresh</code> '''does all of the above''', so in practice you just need to run the following commands to recreate the cert:
The script <code>/root/bin/letsencrypt-refresh</code> '''does all of the above''' automatically.  It stops Apache, runs the commands described above, and starts Apache again.  This can be used not only to refresh a cert that's running out, but also to add a new domain to the cert.  Just add the domain to <code>/root/etc/domains</code> and run the commands.  Note that the letsencrypt command may not work well on a "dumb" terminal such as an Emacs shell buffer.  If in doubt, run it from within a proper terminal emulator.


service apache2 stop  # Assuming Apache is running on the machine
=== Readability of the key files ===
letsencrypt-refresh
service apache2 start


The above can be used not only to refresh a cert that's running out, but also to add a new domain to the cert.  Just add the domain to <code>/root/etc/domains</code> and run the commands.
To ensure that processes running under unprivileged users can read key files, ensure that the users they run under are members of the <code>ssl-cert</code> group, which should have read access to the files in <code>/etc/letsencrypt/live/feministwiki.org</code>.


Note that the letsencrypt command may not work well on a "dumb" terminal such as an Emacs shell buffer.  If in doubt, run it from within a proper terminal emulator.
== Ubuntu package repositories ==


=== Readability of the key files ===
Currently, FeministWiki runs on Ubuntu 16.04 LTS (Xenial), which has rather old Apache and PHP packages.  We use the Ubuntu PPAs <code>ondrej/apache2</code> and <code>ondrej/php</code> to get newer versions.


To ensure that processes running under unprivileged users can read key files, ensure that the users they run under are members of the <code>ssl-cert</code> group, which should have read access to the files in <code>/etc/letsencrypt/live/feministwiki.org</code>.
For F-Droid packages, we use the <code>fdroid/fdroidserver</code> Ubuntu PPA.


== Services ==
== Services ==
Line 138: Line 156:
Software: OpenLDAP
Software: OpenLDAP


The LDAP service contains the central database of FeministWiki members.  The structure looks like this:
The LDAP service contains the central database of FeministWiki members.  For details on the LDAP schema, see [[FeministWiki:LDAP Schema]].


* dc=feministwiki,dc=org
=== Wiki ===
** ou=members
*** cn=''username'' <br/> objectClass: inetOrgPerson <br/> cn: ''username'' <br/> uid: ''username'' <br/> sn: - <br/> userPassword: {SSHA}''saltedhash'' <br/> mail: ''username''@feministwiki.org
*** cn=''username2'' <br/> objectClass: inetOrgPerson <br/> cn: ''username2'' <br/> uid: ''username2'' <br/> sn: - <br/> userPassword: {SSHA}''saltedhash2'' <br/> mail: ''username2''@feministwiki.org <br/> manager: cn=''username'',ou=members,dc=feministwiki,dc=org
*** ...
** ou=groups
*** cn=members <br/> objectClass: groupOfNames <br/> cn: members <br/> member: ''username'' <br/> member: ''username2'' <br/> member: ...


Notes:
Host: feministwiki.org, www.feministwiki.org, fem.wiki, feministwiki.de, www.feministwiki.de <br/>
* The <code>cn</code> (common name) and <code>uid</code> (user ID) fields both contain the username. This is because some software is preconfigured to look at <code>uid</code>, while most look at <code>cn</code>.
Software: MediaWiki
* The <code>sn</code> (surname) field simply contains a minus character as a placeholder, because it's a mandatory field.
* The <code>manager</code> field is optional and we use it to record the member who added the member in question.
 
To make sure passwords are stored with the <code>{SSHA}</code> scheme rather than plain text, the <code>ppolicy</code> "password policy overlay" is used.  ZYTRAX has a very nice book about LDAP which documents how to enable this: http://www.zytrax.com/books/ldap/ch6/ppolicy.html


In short, the steps go as follows (these commands ''should'' work verbatim):
The wiki uses a [https://www.mediawiki.org/wiki/MediaWiki MediaWiki] installation located at <code>/var/www/wiki/w</code>.  It uses the [https://www.mediawiki.org/wiki/LDAP_Stack LDAP Stack] extension for login management, and the "Short URL" feature is enabled.  The wiki uses the SQL database called "feministwiki" and the SQL user of the same name.


  # Add the ppolicy schema
The default wiki is in English. Parallel wiki installations for different languages are supported via a combination of Apache's URL rewriting, and conditional branches in the <code>LocalSettings.php</code> file of the MediaWiki installation:
ldapadd -Y external -H ldapi:/// < /etc/ldap/schema/ppolicy.ldif
# Enable the ppolicy dynamic module
ldapmodify -Y external -H ldapi:/// <<EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy
EOF
# Add the ppolicy overlay with olcPPolicyHashCleartext set to TRUE
ldapadd -Y external -H ldapi:/// <<EOF
dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyHashCleartext: TRUE
EOF


=== Wiki ===
* The rewrite rules ensure that, for any supported language <code>xy</code>, URLs beginning with <code>/xy/wiki/...</code> internally resolve to <code>/w/index.php</code> and URLs beginning with <code>/xy/w/...</code> resolve to <code>/w/...</code>.
* The LocalSettings file checks <code>$_SERVER['REQUEST_URI']</code> to determine the language code prefix in the requested URL, and configures things accordingly:
** It sets <code>$wgArticlePath</code> to <code>/xy/wiki/$1</code> so that <code>/w/index.php</code> knows that when it's invoked via such a URL, it should serve an article.
** It sets <code>$wgScriptPath</code> to <code>/xy/w</code> so that links to scripts served by MediaWiki are correct for the language.
** It sets the SQL database name to <code>feministwiki_xy</code>.
** It configures a "foreign" image database via the [https://www.mediawiki.org/wiki/Manual:$wgForeignFileRepos#Using_files_from_a_database_that_you_can_access_:_ForeignDBRepo,_ForeignDBViaLBRepo ForeignDBRepo] method so that the media upload database of the default wiki is used by all, instead of every parallel wiki having its own media database.


Host: feministwiki.org, www.feministwiki.org <br/>
The domain names feministwiki.de and www.feministwiki.de redirect to <code>https://feministwiki.org/de</code>.  For instance, requesting <code>https://feministwiki.de/wiki/Hauptseite</code> will result in an HTTP redirect to <code>https://feministwiki.org/de/wiki/Hauptseite</code>.
Software: MediaWiki
 
The wiki uses a [https://www.mediawiki.org/wiki/MediaWiki MediaWiki] installation located at <code>/var/www/wiki/w</code> with the [https://www.mediawiki.org/wiki/Extension:LDAP_Authentication LDAP Authentication] plugin for login management and the "Short URL" feature enabled with help of Apache's vhost configuration, which is located at <code>/etc/apache2/sites-available/wiki.conf</code>.
 
The wiki uses the SQL database called "feministwiki" and the SQL user of the same name.


=== Blogs ===
=== Blogs ===
Line 208: Line 199:
Software: phpBB
Software: phpBB


The forum uses a [https://www.phpbb.com/ phpBB] installation located at <code>/var/www/forum</code>.  Most configuration of phpBB, including LDAP authentication, is done through its administration panel.  The style used by the forum is essentially Basic Orange, though the logo is changed via an inheriting style called FeministWiki.
The forum uses a [https://www.phpbb.com/ phpBB] installation located at <code>/var/www/forum</code>.  Most configuration of phpBB, including LDAP authentication, is done through its administration panel.  The style used by the forum is a minimally changed "ProSilver Dark". The forum uses the SQL database called "feministforum" and the SQL user of the same name.
 
The forum uses the SQL database called "feministforum" and the SQL user of the same name.


=== Mail (web interface) ===
=== Mail (web interface) ===
Line 217: Line 206:
Software: Roundcube
Software: Roundcube


The web-interface for the FeministMail uses the [https://roundcube.net/ Roundcube] mail client, installed at <code>/var/www/mail</code>.  It uses the standard "larry" style, but with some tweaks to logos and images.
The web-interface for the FeministMail uses the [https://roundcube.net/ Roundcube] mail client, installed at <code>/var/www/mail</code>.  It uses a FeministWiki-branded modification of the new "elastic" style.


=== Files ===
=== Files ===
Line 248: Line 237:


There are also various tools on the web to automatically test the DNS settings for correctness, to check if the domain/IP is on blacklists, etc., which you can find via Google.  All in all, FeministMail is probably the most complicated service of the FeministWiki, as far as technical background goes.
There are also various tools on the web to automatically test the DNS settings for correctness, to check if the domain/IP is on blacklists, etc., which you can find via Google.  All in all, FeministMail is probably the most complicated service of the FeministWiki, as far as technical background goes.
=== Mailing lists ===
Email domain: lists.feministwiki.org <br/>
Software: GNU Mailman, Postfix
Postfix is configured to recognize <code>lists.feministwiki.org</code> as a "local" domain.  This means it uses the file specified in the <code>alias_maps</code> configuration directive (typically <code>/etc/aliases</code>) to decide the final recipient of an e-mail sent to this domain.  Correspondingly, we populate <code>/etc/aliases</code> with the aliases needed by Mailman to operate each mailing list it controls.
Note that there is no DNS entry for <code>lists.feministwiki.org</code> because e-mail software just checks the MX record for <code>feministwiki.org</code> when the recipient is from the domain <code><em>anything</em>.feministwiki.org</code>.


=== XMPP ===
=== XMPP ===
Line 261: Line 259:
Software: InspIRCd
Software: InspIRCd


FeministIRC uses the [http://www.inspircd.org/ InspIRCd] IRC server with the <code>ldapauth</code> module for LDAP authentication.
FeministIRC uses the [http://www.inspircd.org/ InspIRCd] IRC server with the <code>ldapauth</code> module for LDAP authentication.  The client is authenticated via the combination of the NICK and PASS provided upon connection, which must correspond to the FeministWiki credentials.


=== Add a member ===
=== Account operations ===


Host: add-member.feministwiki.org <br/>
Host: account.feministwiki.org <br/>
Software: custom
Software: custom


The page to add a new member, hosted at <code>/var/www/add-member</code>, uses a bit of self-written HTML, PHP, and a setuid-root C program to invoke the shell script located at <code>/root/bin/fw-adduser</code> with root privileges.
This custom web interface hosted at <code>/var/www/account</code> lets you complete several tasks related to FeministWiki membership, such as changing your account settings, resetting your password, or adding a new member.  It also contains a form to request membership.  The interface is written in HTML, CSS, PHP, and C.