Re: James 3.8 one OpenSuSE 15.5

Rene Cordier <[email protected]> Tue, 9 Jan 2024 14:44:15 +0700
Newsgroups gmane.comp.jakarta.james.user
Message-ID <[email protected]>
Hello,

Interesting read thanks.

Few remarks though, but feel free to agree or not :) :

- any reason to still run the spring version of James? That version I 
believe is not always up-to-date with dependencies (specially the sprint 
dependencies). Truth is it might get deprecated and removed in later 
release if a consensus is reached, as all active dev is done on the 
Guice versions now. You might want to check that (JPA Guice here 
probably closest to the Spring version)

- note that there is active development at the moment (still WIP) 
regarding a Postgresql reactive implementation with james (Guice). I saw 
you seem to use MariaDB but might interest you for the future maybe?

- for sync between your main server and backup, maybe just redirect the 
mails to both platforms, and let them treat the mails separately? If not 
I guess db backup and sync between the two could do it too.

Good job on running latest James on the new OpenSuse though, thanks for 
sharing!

Rene.

On 1/9/24 10:17, cryptearth wrote:
> Hello there everybody,
>
> happy new year 2024 to all of you.
> It's been quite some time since I was last active on this maillist. After
> upgrading my server to OpenSuSE 15.5 and James to 3.8 and after reading the
> recent topics on the web archive I decided to post a small round up how it
> went this way.
>
> Important word of warning and security:
> This is only a personal write-down how I did my setup. I'm aware there're
> still some security improvements to be done. This is meant as an informative
> guide. I'm by no means responsible for any security issues that may arise by
> following this. I myself got hacked by the Log4J issue mostly due to not
> applying the available update fast enough. It's your own responsibility to
> make your setup secure. All I can offer are some guidelines from personal
> experience.
>
> That warning out now let's get to the real topic.
>
> As several of the active devs here know I use James for quite some time now
> and over the years encountered several issues mostly specific to OpenSuSE and
> the packages provided by its repositories. Luckily this time everything went
> smoothly.
>
> I started from a fresh clean "server"-type install, but this should be
> applicable to any existing system as well. So the first step is to fully update
> the new system.
>
> As OpenSuSE comes with postfix I replace it with sendmail for later. I guess
> it's also possible with postfix or exim or any other MTA  providing the
> required sendmail dependency. Using sendmail was just the simplest option I
> figured out when I first used it.
> The keyword here is "nullclient": It configures sendmail to just forward
> everything to James without any handling itself. For this sendmail comes with
> an almost ready-to-use config which only needs one change in /etc/sendmail/
> linux.nullclient.mc in line 27 by replacing the example
> "mailhub.domain.notused" with "localhost". Then just generate the new
> sendmail.cf from it (either as root or via sudo):
> m4 /etc/mail/linux.nullclient.mc > /etc/sendmail.cf
>
> I also have to edit the systemd script. For some reason the systemctl edit
> command works a bit unexpected for simple edits so by appending --full it
> becomes a full override. The service file needs two changes:
>
> 1) moving the PIDFile from /var/run to /run as hinted by systemctl status
> message:
> PIDFile=/run/sendmail.pid
>
> 2) remove the -bd flag from the start args to prevent sendmail from blocking
> port TCP/25:
> Environment="SENDMAIL_ARGS=-L -Am -q30m -om"
>
> Check if sendmail service is enabled and started: systemctl status sendmail
> At least enabled it so it gets started at reboot. As James isn't setup yet to
> take its mails don't start it yet - it could cause a hang into an infinite
> loop.
>
> Before get to James I prepare the rest of the system by install these packages
> (can be installed along when switching postfix for sendmail):
> - java-17-openjdk-devel
> - git
> - maven
> - mariadb
> - phpMyAdmin-apache
> - yast2-http-server
> The required dependencies get pulled in by the resolver. After installing the
> packages YaST tells you to secure MariaDB. So I do this right away by running
> mariadb-secure-installation as root/sudo and set a root password. All other
> questions can be answered with thier default option (just hit enter).
>
> To get phpMyAdmin running only the initial setup using "yast http-server" is
> required. Select enable PHP in the 2nd step and complete the setup by just
> hitting F10 a couple times. If the Apache2 server is accessible via the
> internet care should be taken by limiting phpMyAdmin to localhost. Edit /etc/
> apache2/conf.d/phpMyAdmin.conf line 27 to "Require local" and use ssh tunnels.
> If you have services like a vpn or a tor hidden service running you may want
> to secure it even further with something like an .htaccess or similar. This
> way you prevent attackers from trying to bruteforce your database password.
>
> Complete the pre-setup by use phpMyAdmin to add a new user for James.
>
> Now let's build James:
> git clone https://github.com/apache/james-project -b james-project-3.8.0
> cd james-project
> mvn clean package -DskipTests -T 1C
> As I use the spring package I then unpack the tar in james-project/server/
> apps/spring-app/target/james-server-spring-app-3.8.0-app.tar.gz.
> I also need to get the mariadb-connector/J: https://mariadb.com/downloads/
> connectors/ and place the .jar in the james-server-spring-app-3.8.0/lib
> folder.
> I'm not sure why this isn't distributed along or part of the package manifest
> to pull from the repos - guess this is some licence nonesense.
>
> It's config time now - and there's not that much to do.
> As I don't use POP3 the first I do is disable the POP3 server.
> Next I set up the database stuff by change the driver to
> org.mariadb.jdbc.Driver
> and the connector-string to
> jdbc:mariadb://localhost:3306/james
> Btw: As pretty much any modern JDBC driver should be a type 4.x there's no
> need to specify the driver class name or do something like
> Class.forName()
> As long as the driver jar is in classpath on startup of the JVM it gets pulled
> in via the ServiceLoader-API.
>
> Next I set my domain and the greetings in the imap and smtp servers. I also
> enable StartTLS for both imap and smtp. As for outgoing smtp I also enable
> StartTLS by adding this to the RemoteDelievery in the mailetcontainer.xml:
> <startTLS>true</startTLS>
> This should be added by default as it's only mentioned in the RemoteDelievery
> javadoc but not in the XML doc nor in the config doc.
> Until now I used a Java keystore for the certificate and key. But using the new
> PEM files directly skips this. Thanks for who added this.
>
> The last part is to deal with sendmail and apache2/php mail. For this I first
> add two users to James (along with others like postmaster): webmaster and
> local-service. Then I add this to the mailetcontainer.xml right at the top of
> the root processor:
>
>          <matcher name="local-service"
> match="org.apache.james.mailetcontainer.impl.matchers.And">
>                  <matcher match="RemoteAddrInNetwork=127.0.0.0/8" />
>                  <matcher
> match="org.apache.james.mailetcontainer.impl.matchers.Not">
>                          <matcher match="SMTPAuthSuccessful" />
>                  </matcher>
>                  <matcher
> match="org.apache.james.mailetcontainer.impl.matchers.Not">
>                          <matcher match="[email protected]" />
>                  </matcher>
>                  <matcher
> match="org.apache.james.mailetcontainer.impl.matchers.Not">
>                          <matcher match="RecipientIs=local-
> [email protected]" />
>                  </matcher>
>          </matcher>
>
>          <mailet match="local-service" class="Redirect">
>                  <to>[email protected]</to>
>          </mailet>
>
> To explain its purpose:
> When starting James via crontab by root crond sends a start report via
> sendmail. In order for sendmail to not get stuck in an endless loop trying to
> deliver the crond status I have to provide some drop off destination for it.
> But as I also want to send e-mails by PHP I had to get a bit creative
> filtering. It basically goes like this:
>
> IF incoming mail comes from localhost
> AND is NOT authenticated via smtp auth
> AND is NOT sent by webmaster (from php)
> AND is NOT already redirected to local-service
> THEN redirect to local-service
>
> This rule maybe can be written better - but it was the simplest I came up
> with. The check for the recipient is required so the mail doesn't get
> redirected to itself again. The check for the webmaster is required as
> sendmail drops off php mails with wwwrun@localhost, which is overriden by the -
> f parameter to webmaster. Any other client that regular logs in via AUTH is
> ignored anyway. And the whole thing is limited to localhost.
>
> Finally, add a
> @reboot /path/to/james/bin/james start
> to roots crontab for james autostart.
>
> If everything was done correctly james should start up just fine for the first
> time (it actually already had to for adding the users - but this can be done
> now).
> I do the first start via "console" to verify everything is done correctly.
> After all is done and james starts correctly I just reboot the system. Now
> when all comes up by itself the local-service user should have a mail confirm
> the successful start of James which also confirms that the sendmail nullclient
> and the mailet redirect works.
>
> A common failure can be an issue with name resolution. In this case you have
> to manually set /etc/hosts and reboot again. This can also be done early on as
> one of the first few steps after updating the system.
>
> To send mails from apache this can be done like this:
>
> <?php
>          $to="[email protected]";
>          $subject=$content="this is a apache webmail test";
>          $headers = array(
>                  'From' => 'CryptEarth.de Webmaster <[email protected]>',
>                  'Reply-To' => '[email protected]',
>                  'X-Mailer' => 'PHP/' . phpversion()
>          );
>          mail($to, $subject, $content, $headers, "[email protected]");
> ?>
>
> A few improvements that can (and should) be done:
>
> - don't start james as root but rather move the ports to 8025 and 8143 and use
> a firewall rule to redirect 25 to 8025 and 143 to 8143 ... but I have to figure
> that out
> - maybe rethink about sendmail nullclient and do similar with postfix or exim
> - maybe redo the mailet redirect for local-service and php-mail
> - setting up DKIM on outgoing mails
>
> Currently I have James running on two servers: my main root as primary and on
> a small sbc at home as a backup. Is there a way to synchronize the two servers
> on the application level. Or would it be enough to just synchronize the two
> datases secured by a ssh tunnel? How to handle the differences in the counters
> when both servers receive an e-mail each which have to get synchronized in
> both ways?
>
> Have a nice week.
> Greetings from Germany
>
> Matt
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>