Confluence workbench mirror

Beheer

Guarded rendering from the committed top-level `confluence/` mirror. No live source, personal data, or write action is available.

Kind
PAGE
Version
3
Labels
0
Children
0
On this page
  1. Unsupported Confluence macro: anchorUnsupported macro placeholder; source behavior is intentionally inert.No displayable parameters.Inleiding standaard sFTP koppeling
  2. Unsupported Confluence macro: anchorUnsupported macro placeholder; source behavior is intentionally inert.No displayable parameters.Uit de aansluitvoorwaarden
  3. Unsupported Confluence macro: anchorUnsupported macro placeholder; source behavior is intentionally inert.No displayable parameters.Naamgeving
  4. Unsupported Confluence macro: anchorUnsupported macro placeholder; source behavior is intentionally inert.No displayable parameters.Activiteiten bij sFTP change
  5. Unsupported Confluence macro: anchorUnsupported macro placeholder; source behavior is intentionally inert.No displayable parameters.Procesoverzicht
  6. Unsupported Confluence macro: anchorUnsupported macro placeholder; source behavior is intentionally inert.No displayable parameters.Stappenplan

In dit hoofdstuk staat beschreven wat benodigd is voor het aanmaken van een nieuwe sFTP koppeling.

Inleiding standaard sFTP koppeling

Transport: twee smaken; van intern naar extern, van extern naar intern
Security: twee smaken; username/password, keyfile
Frequentie: in te stellen middels frequency scheduler of CRON job
Bestandslokaties: volgens vast format op nfsshare, of op de ESB ftp server, in te stellen middels properties file. Geen andere opties toegestaan.

Uit de aansluitvoorwaarden

Het is ten alle tijde mogelijk dat een broker wegens verschillende redenen niet beschikbaar is. Voor de sFTP verbindingen wordt gebruik gemaakt van een VIP adres. Achter dit VIP adres liggen twee FTP servers waarbij de loadbalancer zorgt dat de connectie altijd naar een van de twee wordt opgezet.
Bij het aanvragen van sFTP koppeling moet er gebruik worden gemaakt van een NFS share. Deze NFS share moet door de klant worden aangevraagd bij IRN Infra via het self service portaal van Topdesk.
Belangrijk om te vermelden is dat het tpb-esb team geen onderhoud/beheer uitvoert op de NFS shares. Het onderhoud en beheer van deze NFS share is de verantwoordelijkheid van IRN Infra.
Wanneer er gebruik wordt gemaakt van de sFTP connector van Mulesoft is het verplicht om de velden van de connector dynamisch te maken. Hiermee wordt bedoeld dat alle velden middels properties kunnen worden aangepast door het tpb-esb team.
Reconnectie strategie is verplicht bij de sFTP en/of FTPs connector.
Het integratie platform met haar MFT koppeling is geschikt voor een maximale bestandsoverdracht van 10 GB per dag.
De code maakt gebruik van extra component, eerst te installeren in anypoint studio. https://www.mulesoft.com/exchange/68ef9520-24e9-4cf2-b2f5-620025690913/requester-module/Blocked active content: img
Al worden in principe alle benodigde libraries via de pom-file opgehaald.

Naamgeving

Domein-KomtVanaf-GaatNaartoe-mft-ms
In de template staat dit vooraf in gevuld als: rwsdomein-leverendepartij-ontvangendepartij
Met een search en replace door alle bestanden die onderdeel zijn van het template project kun je eenvoudig de naamgeving op de juiste manier aanpassen.
Voorbeeld van Intern-naar-Extern
wm-amice-inspectieview-mft-ms
wm=rwsdomain
amice= leverendepartij
inspectieview / ilt = ontvangendepartij

Activiteiten bij sFTP change

Procesoverzicht


Top down activiteiten





Actie


Details

Wie

Adviseur

Uitvoerder

  1. Firewall & LB


Aanvragen poort 22 toegang

ESB Team


Netwerk Team

  1. FTP user & rechten


Aanmaken DMZ FTP Server user en rechten

ESB Team


ESB Team

  1. Share pad


Share naam aanvragen

ESB Team

Infra adviseur

Infra Team

  1. Share pad mapping


NFS <-> Samba share mapping maken

ESB Team

Infra adviseur

Infra Team

  1. Share user & rechten


Aanmaken Interne FTP Server user en rechten

ESB Team


ESB Team


User account + directory aanmaken
Belangrijk: ftp server bevindt zicht op een cluster ftp101 / 102
Het is belangrijk dat de unixnummer en het wachtwoord op beide hosts gelijk zijn. Anders werkt het niet in het geval dat het VIP adres van 101 --> 102 over gaat.

Stappenplan

Stap 1
log met ssh in op de twee ftp servers
Stap 2
Navigeer naar de directory /etc
Stap 3
open het passwd file met het volgende commando: cat passwd
Stap 4
Bekijk wat het laatste unixnummer is en tel daar 1 bij op (kijk naar laatste entry).
Voorbeeld: ftp_a_aim:x:20032:20032::A_FTP_001/ftp_a_aim:/bin/bash
Het nieuwe unixnummer wordt in dit geval dus: 20033
Voer het volgende commando uit: sudo adduser -u <eerst_vrije_nummer> <userid> (het moet hetzelfde commando zijn !!)
(Verwijderen van verkeerd aangemaakte user, commando: sudo userdel <userid>)
Stap 5
Maak de directory aan door het volgende commando: sudo mkdir /A_FTP_001/<ftp_a_<projectnaam>>
Voorbeeld voor ftp acceptatie!!: sudo mkdir /A_FTP_001/ftp_a_ivsnext
Voorbeeld voor ftp productie!!: sudo mkdir /P_FTP_001/ftp_ivsnext
Stap 6
Maak de chroot directory aan op beide servers:
Commando 1: sudo chown root:root /A_FTP_001/ftp_a_ivsnext
Commando 2: sudo chmod 0755 /A_FTP_001/ftp_a_ivsnext
Stap 7
Maak ftp directory aan op beide servers:
Commando 1: sudo mkdir /A_FTP_001/ftp_a_ivsnext/ftp_a_ivsnext (1 server)
Commando 2: sudo chown ftp_a_ivsnext:ftp_a_ivsnext /A_FTP_001/ftp_a_ivsnext/ftp_a_ivsnext
Commando 3: sudo chmod 0755 /A_FTP_001/ftp_a_ivsnext/ftp_a_ivsnext
Stap 8
Autoriseer <userid> voor het gebruik van FTP d.m.v. chroot. Save het bestand door het volgende commando: sudo cp /etc/ssh/sftp_sshd_config /etc/ssh/sftp_config.<datumvanvandaag>
Stap 9
Voeg nieuwe entry toe door te navigeren naar: cd /etc/ssh en open de file met het commando: sudo vi sftp_sshd_config
Stap 10
druk op insert en scroll helemaal naar onder en voeg het onderstaande toe:
Match User <userid>
AllowTcpForwarding no
ChrootDirectory /A_FTP_001/<Userid>
Stap 11
Genereer een willekeurig wachtwoord door het volgende commando: openssl rand -base64 12
Stap 12
Koppel het wachtwoord aan de userid door:
Commando 1: sudo su -
Commando 2: echo <nieuw wachtwoord> | passwd --stdin <userid>
Commando 3: exit
Stap 13
controleer of het wachtwoord niet verloopt met: sudo chage -l <userid>
Stap 14
Geef een van de ftp servers een restart door het volgende commando: sudo service sshd-sftp restart
Stap 15
Mounten FTP

  • Log in op de juiste FTP server en geef het volgende commando: cat /etc/fstab

  • Voorbeeld:
    //nwr-itvw-tdk022.ad.rws.nl/kpncmdb /topdesk cifs credentials=/etc/creds.topdesk,defaults,uid=20025,gid=20025 0 0
    Waarin:
  • /kpncmdb is de directory waar de bestanden op de server staan
  • /topdesk cifs is de naam van het project (amice, lavs of o.i.d.) en de soort mount
  • de credentials zijn te vinden in de /etc/creds.topdesk directory
    Voorbeeld FW aanvraag

FW aanvraag voorbeeld

Onderstaand is een voorbeeld voor een FW aanvraag van scenario 1. Bij het indienen van een FW aanvraag moet er altijd vanuit de initiërende kant bekeken worden. Dus in geval van scenario 1 komt het initiatief vanuit de interne ESB applicatie die een call doet naar de DMZ applicatie (welke op zijn beurt weer een file van de DMZ ftp server afhaalt). De firewall aanvraag dient dus vanaf de ip addressen intern NAAR de ip addressen extern aangevraagd te worden. Zie onderstaande FW aanvraag:
Nadat port 22 is opgezet moet er bij infra een aanvraag gedaan worden om de loadbalancers te configureren (port 22 doorrouteren naar 8022); Graag port 8022 configureren in de loadbalancers:
(voor een actuele lijst, zie Serverpark document)
Richting de ftp servers in onze DMZ omgeving;
(voor een actuele lijst, zie Serverpark document)
ssh toegang ftp / toevoegen .pub / authorized key
Hierbij de inhoud van het mailtje van de SAS consultant
Hier staat het hele verhaal: https://www.jscape.com/blog/setting-up-sftp-public-key-authentication-command-lineBlocked active content: img
In het kort komt het hierop neer: Zorg de inhoud van de id_rsa.pub in de ~/.ssh/authorized_keys file op de ftp server komt te staan. Dat is dus in een .ssh folder onder de home directory van de dictu user waarmee je inlogt op de FTP server.
Het is nog van belang dat zowel de .ssh directory als de authorized_keys file een chmod hebben van 700. Anders vindt de ssh daemon het niet veilig genoeg en werkt het alsnog niet.

Voorbeelden XML files

Voorbeeld Properties File

Hieronder is in de properties file beschreven waar welke settings in het project via placeholders worden gevuld.

  1. Properties File voor de standaard MFT oplossing voor RWS
  2. Versie 1.0.0 - 16 juli 2021
  3. Edwin Rombeek
    #Application name (change app.name to edit application name you see in the logfile)
    rwsdomein-leverendepartij-ontvangendepartij-mft.app.name=rwsdomein-leverendepartij-ontvangendepartij-mft-ms
    api.name=rwsdomein-leverendepartij-ontvangendepartij-mft-ms
  4. HTTP logging API
    http.logging.api.host=localhost
    http.logging.api.port=8085
    http.logging.api.protocol=HTTP
    http.logging.api.path=/api/v1
  5. LogSuccessfulTransportChoice
  6. Zet deze property op true als iedere succesvol verplaatste bestandsnaam in de log moet worden vastgelegd.
    rwsdomein-leverendepartij-ontvangendepartij-mft.logsuccessfultransport=true
    #Splunk logging
    splunk.logging=true
    splunk.logging.username=acc
    splunk.logging.password=acc
    #File filter (global-sftp-inbound Advanced Tab) is gebaseerd op de volgende expressie:
  7. file:filename-wildcard-filter caseSensitive=${rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.casesensitive}, pattern=${rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile}
    #Je kunt kiezen of bestanden op basis van naam of type worden opgepakt.
    rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile=${rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile.type}
    #rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile=${rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile.name}
    #wildcard pick up certain files
    rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile.type=*.bak
    rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.pickupfile.name=*
    rwsdomein-leverendepartij-ontvangendepartij-mft.wildcard.casesensitive=true
    #inbound sftp Intern (leverendepartij)
    #inbound-sftp-connector-config
    #Advanced tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.validate.connections=false
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.freq=60000
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.fileage=60000
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.waittime=40000
    #File tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.keepFileOnError=true
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.autoDelete=false
    #Reconnection tab
    #Strategies: - Standard Reconnection. Freq (ms) = 2000
  8. - Reconnection Attempts = 200
  9. global-sftp-inbound
    #General tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.host=acceptatie.sftp.esb.intranet.rws.nl
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.port=22
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.path=/amice/Datalevering_derden/Inspectieview
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.user=ftp_a_amice
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.password=*********
    #Advanced tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.responsetimeout=100000
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.timings.polling.freq=1000
    #Reconnection tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.reconnection.freq_ms=2000
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.reconnection.attempts=200
    #File tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.tmp.directory.inbound=Processed
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.tmp.directory.outbound=
    #Mule Requester, die global-sftp-inbound als resource gebruikt, heeft de volgende timeout:
    rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.timeout=10000
    #outbound sftp Extern (ontvangendepartij)
  10. outbound-sftp-connector-config
    #General tab
  11. Output - Output Pattern: ${rwsdomein-leverendepartij-ontvangendepartij-mft.outbound.sftp.output.pattern}
  12. Authentication \u2013 Identity File: ${sftp.outbound.identityfile}
    #Advanced tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.outbound.validate.connections=false
    rwsdomein-leverendepartij-ontvangendepartij-mft.outbound.sftp.polling.freq=10000
    #Reconnection tab
    #Strategies: - Do not use a reconnection strategiy
  13. - Standard Reconnection. Freq (ms) = 2000
  14. - Reconnection Attempts = 2
    #File tab
    rwsdomein-leverendepartij-ontvangendepartij-mft.outbound.sftp.keepFileOnError=true
    rwsdomein-leverendepartij-ontvangendepartij-mft.outbound.sftp.autoDelete=false


    #poller (Time Unit = Milliseconds)
    rwsdomein-leverendepartij-ontvangendepartij-mft.poller.frequency=10000
    rwsdomein-leverendepartij-ontvangendepartij-mft.poller.startdelay=5000
    #rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.cronexpression=
    #rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.crontimezone=










Voorbeeld MFT-receive-sftp-file.xml





MFT-receive-sftp-file Poller settings

rwsdomein-leverendepartij-ontvangendepartij-mft-receive-sftp-file : Poller settings
Het is mogelijk om op twee verschillende manieren een poller interval in te stellen voor het ophalen van bestanden die doorgezet moeten worden;
ofwel met een standaard frequency, ofwel middels een cron job.
In de properties file worden de volgende placeholders geplaatst, afhankelijk van de gekozen methode:
#poller fixed-frequency-scheduler (Time Unit = Milliseconds)
rwsdomein-leverendepartij-ontvangendepartij-mft.poller.frequency=10000
rwsdomein-leverendepartij-ontvangendepartij-mft.poller.startdelay=5000
of
#poller cron-scheduler (CRON)
rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.cronexpression=
rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.crontimezone=

In de rwsdomein-leverendepartij-ontvangendepartij-mft-receive-sftp-file.xml flow wordt in de sectie <!-- FLOWS --> één van onderstaande stukjes xml gebruikt, afhankelijk van de gekozen methode.
<poll doc:name="Poll">
<fixed-frequency-scheduler frequency="${rwsdomein-leverendepartij-ontvangendepartij-mft.poller.frequency}"
startDelay="${rwsdomein-leverendepartij-ontvangendepartij-mft.poller.startdelay}"/>
<mulerequester:request doc:name="Mule Requester"
resource="global-sftp-inbound"
config-ref="Mule_Requester"
timeout="${rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.timeout}"/>
</poll>

<poll doc:name="Poll">
<schedulers:cron-scheduler expression="${rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.cronexpression}"
timeZone="${rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.polling.crontimezone}"/>
<mulerequester:request doc:name="Mule Requester"
resource="global-sftp-inbound"
config-ref="Mule_Requester"
timeout="${rwsdomein-leverendepartij-ontvangendepartij-mft.inbound.sftp.timeout}"/>
</poll>





Voorbeeld MFT-error-handling.xml





mule-deploy.properties
#Wed Jun 16 12:14:03 CEST 2021
redeployment.enabled=true
encoding=UTF-8
domain=default
config.resources=rwsdomein-leverendepartij-ontvangendepartij-mft-error-handling.xml,rwsdomein-leverendepartij-ontvangendepartij-mft-logflows.xml,rwsdomein-leverendepartij-ontvangendepartij-mft-receive-sftp-file.xml


log4j2.xml

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<!--These are some of the loggers you can enable.
There are several more you can find in the documentation.
Besides this log4j configuration, you can also use Java VM environment variables
to enable other logs like network (-Djavax.net.debug=ssl or all) and
Garbage Collector (-XX:+PrintGC). These will be append to the console, so you will
see them in the mule_ee.log file. -->

Voorbeeld .log file




<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdBlocked active content: img">
<modelVersion>4.0.0</modelVersion>
<groupId>nl.rws.cip</groupId>
<artifactId>rwsdomein-leverendepartij-ontvangendepartij-mft-ms</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>mule</packaging>
<name>Mule rwsdomein-leverendepartij-ontvangendepartij-mft-ms Application</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<mule.version>3.9.1-20210120</mule.version>
<mule.tools.version>1.7</mule.tools.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-app-maven-plugin</artifactId>
<version>${mule.tools.version}</version>
<extensions>true</extensions>
<configuration>
<copyToAppsDirectory>true</copyToAppsDirectory>
<inclusions>
<inclusion>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-requester</artifactId>
</inclusion>
</inclusions>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/app/</directory>
</resource>
<resource>
<directory>src/main/api/</directory>
</resource>
<resource>
<directory>mappings/</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- Mule Dependencies -->
<dependencies>
<!-- Xml configuration -->
<dependency>
<groupId>com.mulesoft.muleesb</groupId>
<artifactId>mule-core-ee</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<!-- Xml configuration -->
<dependency>
<groupId>com.mulesoft.muleesb.modules</groupId>
<artifactId>mule-module-spring-config-ee</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<!-- Mule Transports -->
<dependency>
<groupId>org.mule.transports</groupId>
<artifactId>mule-transport-file</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mule.transports</groupId>
<artifactId>mule-transport-http</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mulesoft.muleesb.transports</groupId>
<artifactId>mule-transport-jdbc-ee</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mulesoft.muleesb.transports</groupId>
<artifactId>mule-transport-jms-ee</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mule.transports</groupId>
<artifactId>mule-transport-vm</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<!-- Mule Modules -->
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-launcher</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-scripting</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-xml</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-client</artifactId>
<version>${mule.version}</version>
<scope>provided</scope>
</dependency>
<!-- for testing -->
<dependency>
<groupId>org.mule.tests</groupId>
<artifactId>mule-tests-functional</artifactId>
<version>${mule.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-module-requester</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>Central</id>
<name>Central</name>
<url>https://repo1.maven.org/maven2/Blocked active content: img</url>
<layout>default</layout>
</repository>
<repository>
<id>mulesoft-releases</id>
<name>MuleSoft Releases Repository</name>
<url>http://repository.mulesoft.org/releases/Blocked active content: img</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>mulesoft-release</id>
<name>mulesoft release repository</name>
<layout>default</layout>
<url>http://repository.mulesoft.org/releases/Blocked active content: img</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>

Mirror provenance
Mirror source
confluence/spaces/INFRAARCH/pages/189136981/page.metadata.json
Storage source
confluence/spaces/INFRAARCH/pages/189136981/page.storage.xhtml
Access
Committed snapshot only