Le problème est que public_html doit être accessible à Apache (user www-data, nobody ou apache, selon la distrib). Or il est souvent facile, surtout avec un accès ssh, d'obtenir les droits de cet utilisateur (vulnérabilité locale, en passant par un script php, etc.).
Une solution serait de configurer Apache pour qu'il prennent les droits de l'utilisateur courant, lorsqu'il doit afficher un userdir. De cette façon, on peut configurer les droits d'accès de public_html pour qu'il ne soit accessible qu'à l'utilisateur en question (700). Il sera donc accessible à Apache pour servir du contenu, et inacccesible aux autres utilisateurs.
On peut faire ça avec des modules (mod_suphp, etc.), cependant je n'ai jamais essayé.