Ghost doesn’t really support this. A possible workaround:
Set the monthly price to match the yearly price so that if someone manages to sign up anyway, they don’t get any benefit. (There are enough places where a link to portal may be baked into your theme that you’ll have to play whack-a-mole with…)
Use a custom membership flow, instead of using Portal. Display the tiers available on a Ghost page, using the {{tiers}} helper. Use custom logic to not offer a monthly option. A number of custom themes have pricing pages built in that could be modified.