Well the first thing I'd ask is whether the areas can be represented "algorithmically" or if they need to be block by block. For example, if the GUI involves drawing rectangles to define the area then really only two points need to be saved per rectangle and I'm assuming there wouldn't be a great many overall areas.
In other words, if you want to save rectangular areas I don't think you need to store information for every block within that area. For rectangles I'd just create a simple class to store the two corners and then make a list of those rectangles. I would probably save it on the server side as world data with a simply serializer.
My next question is what exactly you mean by "protect" but assuming you mean it is not modifiable by players you can basically override/intercept all the player interaction with the blocks and cancel it if is within the areas.
Lastly, for syncing between client and server it may happen "automatically" if the modifiability is determined by the server. I'm not sure exactly how breaking blocks works, but several things send the user input (the mouse click) to the server that then takes the action (or in your case prevents the action) and then the results are automatically synced back to client. However, there are other things like movement where the client tries to do some processing to make it smoother and that might cause visual glitches while the server sync catches up.
So if you want client itself to be aware of the protected area, I would simply send a custom packet to the client whenever a player joins the world and resend any updates to all players if there is a change in the area definitions.