Estimate the scale of the system. Consider daily active users, read/write ratio, storage requirements, bandwidth, and any relevant QPS calculations...
The read database needs to be partitioned by user id if the transactions through ATM are going to be frequent. If the volume of transactions are not going to be high, a sharding/partitioning strategy of state or county would be enough. Otherwise by user id would be a good strategy to scale the read volume in the system. The front end uses consistent hashing on the user ID to route each request to the correct shard with the ZooKeeper keeping a live registry of the available hosts. To verify that the request to authenticate/view etc comes from a real ATM we can use a certificate verification mechanism with the certificate in the client being randomized every 24 hours. Additionally we can use geofencing to verify the client is residing within a specific geographic boundary.