Hi,
Enforcing deployments only by service principals it is not possible. The only way to semi-achieve this is by giving appropriate permissions to deploy/create resources to service principals only and for all other accounts to give only reader permissions. In case some actions needs to be done by users you can use Entra PIM to allow access temporary. That is usually a standard practice. If you want to limit the access to resources deployed by IaC I would suggest to look at Azure Bicep and deployment stacks. Deployment stacks allows for locking the resources so they cannot be modified outside of the deployment stacks deployment. Alternatively you can look at Azure Policy deny action as a way to protect resources.
Please "Accept the answer" if the information helped you. This will help us and others in the community as well.