Adding more zeroes (more precisely as a prefix) to the required block hash (which is the hash of block header) makes it more difficult because you need to keep hashing the block header until you find a hash value that is less than the required maximum numeric hash value (you update the block header everytime by incrementing the nonce in it which changes the block header. Presently because of ASICs this field is too small, so the extra nonce is stored in unused locking script of Coinbase transaction, which as a result changes Merkle root which is part of the block header). Here is a documentation of what goes into block header:
https://en.bitcoin.it/wiki/Block_hashing_algorithm
Mathematically to make sense of it, think of it this way, if I ask you find a number at random from 0 to 100 less than 90, how many times do you have to try before you get a number for sure less than equal to 90? It is exactly 10 times. This same principle applies to SHA-256 of the block header.