+1 for this Idea Aleks.

This will help a lot of organizations and make work easier to spin out new
tenants when required.
Let me know how I can help you the same, maybe with documentation I could
be useful.


Regards,
Bharath
Lead Implementation Analyst | Mifos Initiative
Skype: live:cbharath4| Mobile: +91.7019635592
http://mifos.org  <http://facebook.com/mifos>
<http://www.twitter.com/mifos>


On Mon, Dec 19, 2022 at 11:27 AM Manoj VM <ma...@fynarfin.io> wrote:

> Thanks Alekx,
>
> .... One feature that currently we do not have is to set up a new tenant
> dynamically on a running system. The configurations usually are loaded in
> the startup and that may also inherit the same issue. While most of the
> implementations do not require dynamic loading of a new tenant, I feel this
> is a good-to-have and usefull feature.
>
> you have already addressed the "sharing credentials in the property files"
> concern.
>
>
> Thanks and Regards,
>  Manoj Mohanan
>
>
>
> On Mon, Dec 19, 2022 at 11:02 AM Aleksandar Vidakovic <
> chee...@monkeysintown.com> wrote:
>
>> ... definitely James... just left a comment on the Jira ticket in
>> response to Victor. Another important point is to introduce this feature in
>> a non-disruptive way. Those that have systems already running will get a
>> hint (in the boot log for example) to move to the new way of tenant
>> configuration and if you start Fineract fresh (first time) properties
>> approach could be default (pending vote of community).
>> In the comment to Victor I've mentioned also that we can't just dump
>> credentials in files or logs... made a proposal with a secured REST
>> endpoint that admins can use to download any migration properties (in
>> production you can turn this feature off). Pretty sure there will be more
>> input from the community on that point.
>> In any case: documentation will be included.
>>
>> On Mon, Dec 19, 2022 at 6:12 AM James Dailey <jamespdai...@gmail.com>
>> wrote:
>>
>>> Thanks Aleks
>>>
>>> Back in the day, indeed before this use of a database table for tenants,
>>> we used a property file for all sorts of useful run time configuration.
>>>
>>> My only caution would be to - through clear documentation- make it
>>> obvious what belongs in the application.properties and what does not.
>>>
>>>
>>>
>>> On Sun, Dec 18, 2022 at 8:59 PM Aleksandar Vidakovic <al...@apache.org>
>>> wrote:
>>>
>>>> Hi everyone,
>>>>
>>>> ... just wanted to run an idea by you that I think would be a great
>>>> improvement both in terms of security and usability. I've created a Jira
>>>> ticket with all the details (as much as I have them currently on my radar)
>>>> at https://issues.apache.org/jira/browse/FINERACT-1833 and would
>>>> really appreciate your thoughts and additional feedback, things that I
>>>> might have missed, things you miss in the proposal. I'll post the
>>>> description here for convenience.
>>>>
>>>> At the moment Fineract's multi-tenancy feature is based on a separate
>>>> tenant database with a single table; each row contains the database
>>>> connection details and timezone settings for each tenant. I am proposing to
>>>> make this feature an official Fineract extension point and to provide an
>>>> alternative implementation based on application.properties instead of the
>>>> database approach.
>>>>
>>>> Using application.properties is - for a Spring Boot - the best place to
>>>> put any kind of application configuration. Since Fineract's inception a lot
>>>> has happened in the Spring/Boot eco-system. Reloadable configurations are
>>>> nothing strange anymore and a solved problem. In fact, they are especially
>>>> useful when applications are deployed in a Kubernetes environment and
>>>> ensure that Fineract's application context is always in a correct state. A
>>>> recent example where this was applied was in the fix for a file traversal
>>>> vulnerability related to ContentRepository (see FINERACT-1794). Instead of
>>>> using the JDBC based ConfigurationService we moved the configuration for
>>>> file system and S3 based file storage to application.properties. This makes
>>>> life immediately easier for everyone, we removed another point of failure
>>>> (the database) and we laid the ground to make this a true extensible
>>>> feature (watch this space, we have a proposal to add Azure Storage) without
>>>> having to deal with database schemas and Liquibase migrations. It is so
>>>> much easier just to deal with the properties files and to adapt them if
>>>> needed.
>>>>
>>>> To ensure that configuration information is separated by tenant we
>>>> would not store everything in the default application.properties file.
>>>> Obviously we don't know yet which tenants users want to add; and if we
>>>> stored the tenant information in that file we would need to constantly
>>>> (well, every time we add a tenant) overwrite that file. This would be at
>>>> the least very annoying, because this file is under Git control, means:
>>>> when the next release upgrade needs to be applied then there is a potential
>>>> for dropping the ball and someone overwrites your tenant configuration.
>>>> Instead, each tenant's configuration would be provided in a separate Spring
>>>> Boot profile configuration, e. g. the default tenant's configuration would
>>>> be provided in a file named "application-tenant-default.properties". The
>>>> prefix "application-tenant-" is a convention that everyone should follow.
>>>> We might have later other features that could use profile configurations
>>>> and/or custom modules might use these (profile) mechanics too. Just to
>>>> avoid any collisions. This file based tenant configuration approach would
>>>> allow you to easily add and remove (e. g. via Docker volume mount for the
>>>> files and a simple command line parameter for Fineract's startup command
>>>> via "-Dspring.profiles.active=default,tenant-default,tenant-abc,...")
>>>> additional tenants in a way that is very likely more "natural" for your
>>>> DevOps people, having to deal with configuration in a database is a bit of
>>>> a distracting context switch.
>>>>
>>>> And finally: the current approach has also some security related
>>>> issues. The credentials for the tenants' database connections are stored in
>>>> plain text which is pretty much a no-go (and we've already received
>>>> requests from community members to address this issue). If we move this to
>>>> the properties files then you can use pretty much any sensible strategy
>>>> that is available today to safely store credentials like vaults (Hashicorp
>>>> Vault, Kubernetes Secrets) or environment variables for example. These
>>>> approaches are also first class citizens supported by Spring Cloud
>>>> (Kubernetes Secrets, vaults etc.). The current database configuration also
>>>> doesn't allow to properly separate concerns between DevOps and developers
>>>> (the database migration is maintained in Git which means under the
>>>> developers' control). Usually you would want to keep this apart from each
>>>> other.
>>>>
>>>> And no worries, there are no plans to remove the current way how
>>>> tenants are configured, but I think it would be a good idea to default to
>>>> the easier and more secure approach (properties) and still leave an option
>>>> for those who can't or don't want to switch. The idea is also to provide
>>>> some help with migrating your existing tenants to properties files. There
>>>> could be some migration component that can help creating the necessary
>>>> files (details to be defined), e. g. when the application boots up in the
>>>> log messages (similar how Spring Boot does it if there are e. g.
>>>> configuration properties changes etc.).
>>>>
>>>> Please let me know what you think.
>>>>
>>>> Cheers,
>>>>
>>>> Aleks
>>>>
>>> --
>>> Sent from Gmail Mobile
>>>
>>

Reply via email to