Re: Replication and user privileges

Jim <[email protected]> Tue, 26 Feb 2019 13:57:11 -0500
Newsgroups gmane.comp.db.mysql.general
Message-ID <[email protected]>
--------------E2BD4040F3021D5F190C38B4
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

On 2/26/2019 9:44 AM, shawn l.green wrote:
> Hello Jim,
>
> On 2/25/2019 7:29 PM, Jim wrote:
>> On 2/25/2019 5:46 PM, shawn l.green wrote:
>>> Hello Jim,
>>>
>>> On 2/25/2019 5:04 PM, Jim wrote:
>>>> I have a question about mysql replication. I believe I understand most
>>>> of it, but have a question about user privileges.
>>>>
>>>> I understand on the master, the replication user must have the
>>>> Repl_slave_priv privilege as described here:
>>>> https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-slave 
>>>>
>>>>
>>>>
>>>>
>>>> My question is about what replication-related users and privileges 
>>>> must
>>>> exist on the slave.
>>>>
>>>> So, for example, if an insert on the master that is to be 
>>>> replicated is
>>>> performed by user 'abc' with proper insert permissions on the master,
>>>> does that same 'abc' user with same insert permissions need to 
>>>> exist on
>>>> the slave as well?
>>>>
>>>> In other words, what user is performing the replication operation 
>>>> on the
>>>> slave? I don't see any indication of users referenced in the bin logs
>>>> that I have examined on the master. Are user and privileges regarding
>>>> replicated queries irrelevant on the slave and that is handled all
>>>> internally via the replication thread with no regard to user 
>>>> privileges?
>>>>
>>>> Thank you.
>>>> Jim
>>>>
>>>
>>> Your final supposition is correct. All privileges were checked and
>>> verified on the master when the original command was executed. The
>>> Replication system on the slave is going to repeat that change as well
>>> as possible given the state of its copy of the data without regards to
>>> "who originally performed this change" on the upstream master.
>>>
>>> We do not store credentials in the Binary Log because they are not
>>> important to either of the purposes of the Binary Log
>>>
>>> * point-in-time recovery
>>> or
>>> * Replication (which is very much like an automated, continuous
>>> point-in-time recovery)
>>>
>>> ===
>>>
>>> That replication account you mentioned, on the master, is required to
>>> give a slave (and you could have several) enough rights to read the
>>> Binary Log and not much else. This allows you to create an account
>>> that can login from a remote location with the "least privileges"
>>> necessary to do its job. This minimizes your data's exposure should
>>> that account become compromised.
>>>
>>> Many other accounts could also have the REPL_SLAVE_PRIV privilege and
>>> any of those could be used by a slave to do the same job. However
>>> losing control over one of those more privileged accounts could pose a
>>> higher risk to your data.
>>>
>>>
>>
>> Thanks, Shawn. Your response confirms what I had assumed was happening.
>>
>> So bottom line... what I plan to do is strip the various
>> insert/update/delete privileges from appropriate db users on my slaves.
>> I had placed them there originally because I thought they would be
>> needed for the replicated queries, but not true based on your response.
>>
>> I only want the various mysql users used by my code to have select privs
>> on the slaves so that if somehow a slave was mistakenly written to via a
>> bug in my code, that write would fail and I would receive the error. The
>> slaves should only be used for selects and should never experience a 
>> write.
>>
>> That would make sense based on our discussion, correct?
>>
>> Thanks again.
>> Jim
>>
>
> As masters and slaves can exchange "positions" or "roles" (it depends 
> on how you like to mentally visualize the relationship) within a 
> replication graph in a failover situation, adding time to re-establish 
> actual permissions using GRANT commands to reset user accounts to 
> their old privileges may not be time you want to spend.
>
> A cleaner, simpler solution is to set the --super-read-only flag in 
> the server:
> https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_super_read_only 
>
>
> That way, you get the behavior you want (no writes to a read-only 
> slave) without forcing differences to the content of your privileges 
> tables within different nodes of your Replication setup.  Each node 
> will remain a transactionally consistent copy of all the others 
> (within the temporal limits of replication being an asynchronous 
> process).
>
> Yours,
>

Thanks, Shawn.

super-read-only looks perfect for what I want. I can keep my slaves with 
all the potential users needed to take over as master without risking 
unwanted writes.

Given how you read:
"If the |read_only| 
<https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_read_only> 
system variable is enabled, the server permits client updates only from 
users who have the |SUPER| 
<https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_super> 
privilege. If the |super_read_only| 
<https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_super_read_only> 
system variable is also enabled, the server prohibits client updates 
even from users who have |SUPER| 
<https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_super>."
One somewhat gets the impression that in order to enable 
super_read_only, one must also enable read_only.

However, based on:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_read_only
I see:
"Setting |super_read_only| 
<https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_super_read_only> 
to |ON| implicitly forces |read_only| 
<https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_read_only> 
to |ON|. "
So that reinforces that one only needs set super_read_only.

Is it appropriate to configure this in my.cnf, eg:
super-read-only=ON

Thanks again for the incredibly helpful suggestion.

Jim


--------------E2BD4040F3021D5F190C38B4--