Você pode conseguir isso usando o ACL. Veja a man page de setfacl / getfacl para detalhes.
Infelizmente, a sintaxe é um pouco complexa. Tente algo como:
setfacl -s u::rwx,g::r-x,o::r-x,m:rwx,u:john:rwx,d:u:john:rwx /home/john/public_html
Bem, umask continuará a ser útil para arquivos recém-criados, mas você também pode "substituir" umask usando a ACL:
setfacl -s u::rwx,g::r-x,o::r-x,m:rwx,u:john:rwx,d:u:john:rwx,d:u::rwx,d:g::r-x,d:o::r-x,d:m:rwx /home/john/public_html